2012-04-13 24 views
26

Por lo tanto, necesito hacer referencia a determinados subdocumentos de manera exclusiva de los elementos de mi colección. Por ejemplo:¿Cómo puedo crear identificaciones únicas para documentos incrustados en MongoDB?

User = { 
    'name': 'jim', 
    'documents: [ 
     {'id': 0001, 'title': "My document"}, 
     {'id': 0002, 'title': "My second document!"}, 
    ] 
} 

así que tengo que ser capaz de crear automáticamente las identificaciones para los nuevos documentos, preferiblemente no a nivel de aplicación (ya que habrá condiciones de carrera en el escenario de desarrollo real).

¿Hay alguna manera de utilizar ObjectId autogenerado de mongo (utilizado en el campo _id en el nivel de colección), o algo similar?

+1

No si usa un Guid no lo hará –

Respuesta

19

Sí, utilizando ObjectId de mongo es el camino a seguir. Lo único es: debes generarlos tú mismo, en el código de la aplicación. Están destinados a ser únicos en el mundo, diferentes trabajadores no generarán dos ObjectIds idénticos, por lo que no hay una condición de carrera en ese sentido.

Todos los controladores oficiales deberían proporcionar una forma de generar ObjectId. Así es como está en Ruby:

oid = BSON::ObjectId.new 
+0

¿Tiene alguna idea de cómo realizarlo con mongo CLI ??? –

+2

@PiniCheyni Me gusta esto: 'new ObjectId()' – Clouren

9

Todos los controladores tienen funcionalidad para generar ObjectIds.

En el shell que acaba de hacer new ObjectId():

> db.test.insert({x:new ObjectId()}); 
> db.test.find(); 
{ "_id" : ObjectId("4f88592a06c05e4de90d0bc1"), "x" : ObjectId("4f88592a06c05e4de90d0bc0") } 

En Java es new ObjectId() también. Consulte los documentos de API para su controlador para ver la sintaxis específica.

0

Y es como se hace en Clojure, asumiendo el uso de congomongo aquí:

(import org.bson.types.ObjectId) 
(str (ObjectId.)) ; => "12345xxxxx" 
6

Con mongoengine crear un ObjectId en un documento incrustado como este:

from bson.objectid import ObjectId 

class Address(EmbeddedDocument): 
    _id = ObjectIdField(required=True, default=lambda: ObjectId()) 
    street = StringField() 
+0

'default = ObjectId' también debería funcionar –

Cuestiones relacionadas