Aumento automático en MongoDB para almacenar la secuencia de ID de usuario único

Estoy creando un sistema analítico, la llamada 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 un ID de incremento automático para marcar un punto de datos de análisis en un bitarray / bitset. De modo que los primeros encuentros de usuario corresponderían al primer bit de bitarray, el segundo usuario sería el segundo bit de bitarray, etc.

Entonces, ¿existe una forma sólida y rápida de generar ID de usuario únicos incrementales en MongoDB?

Puedes, pero no deberías http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

Cada objeto en mongo ya tiene una identificación, y se pueden ordenar en el orden de inserción. ¿Qué hay de malo en obtener la colección de objetos de usuario, iterar sobre ella y usar esto como ID incrementado? Er ir por tipo de trabajo de reducir mapa por completo

Como respuesta seleccionada dice que puede usar findAndModify para generar identificadores secuenciales.

Pero estoy totalmente en desacuerdo con la opinión de que no deberías 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 una respuesta detallada aquí .

Primero crea una colección de contadores , que mantendrá 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}) 

Creación de 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; } 

Insertar 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 vieja pregunta, pero publicaré mi respuesta para la posteridad …

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

Estoy construyendo un CRM de escala moderada a grande en MongoDb, C # (API de Backend) y Angular (aplicación web frontend) y encontré que ObjectId es terriblemente terrible para usar en enrutamiento angular para seleccionar entidades particulares. Lo mismo con el enrutamiento API Controller.

La sugerencia anterior funcionó perfectamente para mi proyecto.

 db.contacts.insert({ "id":db.contacts.find().Count()+1, "name":"John Doe", "emails":[ "john@doe.com", "john.doe@business.com" ], "phone":"555111322", "status":"Active" }); 

El motivo por el cual es perfecto para mi caso, pero no en todos los casos, es que, como dice el comentario anterior, si elimina 3 registros de la colección, obtendrá colisiones.

Mis reglas comerciales establecen que debido a nuestros SLA internos, no podemos eliminar datos de correspondencia o registros de clientes por más tiempo que la vida potencial de la aplicación que estoy escribiendo, y por lo tanto, simplemente marque registros con un enum “Estado” que es “Activo” o “Eliminado”. Puede eliminar algo de la interfaz de usuario, y dirá “Se ha eliminado el contacto”, pero lo único que ha hecho la aplicación es cambiar el estado del contacto a “Eliminado” y cuando la aplicación llama al depósito para obtener una lista de contactos, filtrar eliminó los registros antes de enviar los datos a la aplicación del 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.