serial number create collection autoincremental autoincrement mongodb auto-increment uniqueidentifier bitset bitarray

number - Incremento automático en MongoDB para almacenar la secuencia de ID de usuario única



mongodb sequential number (5)

Estoy haciendo un sistema de análisis, la llamada a la API proporcionaría una ID de usuario única, pero no está en secuencia y es muy escasa.

Necesito dar a cada ID de usuario único una identificación de incremento automático para marcar un punto de datos analítico en un bitarray / bitet. De modo que los primeros encuentros de usuario corresponderían al primer bit del bitarray, el segundo usuario sería el segundo bit del bitarray, etc.

Entonces, ¿hay una manera sólida y rápida de generar ID de usuario únicas incrementales en MongoDB?


Como dice la respuesta seleccionada, puede usar findAndModify para generar ID secuenciales.

Pero estoy totalmente en desacuerdo con la opinión de que no debes hacer eso. Todo depende de las necesidades de su negocio. Tener una ID de 12 bytes puede consumir muchos recursos y causar problemas de escalabilidad significativos en el futuro.

Tengo respuesta detallada here .


Primer registro debe ser agregado

"_id" = 1 in your db $database = "demo"; $collections ="democollaction"; echo getnextid($database,$collections); function getnextid($database,$collections){ $m = new MongoClient(); $db = $m->selectDB($database); $cursor = $collection->find()->sort(array("_id" => -1))->limit(1); $array = iterator_to_array($cursor); foreach($array as $value){ return $value["_id"] + 1; } }


Primero cree una colección de contadores , que hará un seguimiento del último valor de secuencia para todos los campos de secuencia.

db.createCollection("counters")

Use el siguiente código para insertar este documento de secuencia en la colección de contadores:

db.counters.insert({_id:"tid",sequence_value:0})

Creando la función de Javascript:

function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify({ query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, new:true }); return sequenceDocument.sequence_value; }

Inserte dos documentos:

db.products.insert({ "_id":getNextSequenceValue("tid"), "product":"Samsung", "category":"mobiles" }) db.products.insert({ "_id":getNextSequenceValue("tid"), "product":"Samsung S3", "category":"mobiles" })

Obtener documentos insertados:

db.prodcuts.find()

SALIDA

{"_id": 1, "producto": "Samsung", "categoría": "móviles"}

{"_id": 2, "producto": "Samsung S3", "categoría": "móviles"}



Sé que esta es una pregunta antigua, pero publicaré mi respuesta para la posteridad ...

Depende del sistema que esté construyendo y de las reglas comerciales particulares establecidas.

Estoy creando un CRM de moderada a gran escala en MongoDb, C # (Backend API) y Angular (aplicación web Frontend) y encontré ObjectId absolutamente terrible para su uso en enrutamiento angular para seleccionar entidades particulares. Lo mismo con el enrutamiento del controlador API.

La sugerencia anterior funcionó perfectamente para mi proyecto.

db.contacts.insert({ "id":db.contacts.find().Count()+1, "name":"John Doe", "emails":[ "[email protected]", "[email protected]" ], "phone":"555111322", "status":"Active" });

La razón es perfecta para mi caso, pero no todos los casos es que, como se indica en el comentario anterior, si elimina 3 registros de la colección, obtendrá colisiones.

Las reglas de mi negocio establecen que, debido a nuestros acuerdos de nivel de servicio internos, no se nos permite eliminar los datos de correspondencia o los registros de los clientes durante más tiempo que la vida útil potencial de la aplicación que estoy escribiendo, y por lo tanto, simplemente marque los registros con una enumeración "Estado" que es "Activo" o "Eliminado". Puede eliminar algo de la interfaz de usuario, y dirá "Se ha eliminado el contacto", pero todo lo que la aplicación ha hecho es cambiar el estado del contacto a "Eliminado" y cuando la aplicación llama al repositorio para obtener una lista de contactos, filtro registros eliminados antes de enviar los datos a la aplicación cliente.

Por lo tanto, db.collection.find (). Count () + 1 es una solución perfecta para mí ...

No funcionará para todos, pero si no va a eliminar datos, funciona bien.