2012-04-13 15 views
26

Quindi è necessario fare riferimento a documenti parziali in modo univoco dagli elementi della mia raccolta. Per esempio:Come posso creare ID univoci per documenti incorporati in MongoDB?

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

Così ho bisogno di essere in grado di auto-creare gli ID per i nuovi documenti, preferibilmente non a livello di applicazione (dal momento che non ci saranno condizioni di gara nello scenario di sviluppo vero e proprio).

C'è un modo per utilizzare ObjectGo autogenerato di mongo (utilizzato nel campo _id a livello di raccolta) o qualcosa di simile?

+1

Non se si utilizza un Guid non ci sarà –

risposta

19

Sì, usare l'ObjectId di mongo è la strada da percorrere. L'unica cosa è: devi generarli da soli, nel codice dell'applicazione. Sono pensati per essere unici a livello globale, i diversi lavoratori non generano due ObjectID identici, quindi non c'è nessuna condizione di competizione in questo senso.

Tutti i driver ufficiali dovrebbero fornire un modo per generare ObjectId. Ecco come funziona Ruby:

oid = BSON::ObjectId.new 
+0

Avete qualche idea su come eseguirlo con mongo CLI ??? –

+2

@PiniCheyni In questo modo: 'il nuovo collegamento ObjectId()' – Clouren

9

Tutti i driver dispongono di funzionalità per la generazione di ObjectId.

Nella shell basta fare new ObjectId():

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

In Java è new ObjectId() pure. Vedi i documenti API per il tuo driver per vedere la sintassi specifica.

0

Ed ecco come farlo in Clojure, ipotizzando l'uso di congomongo:

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

Con mongoengine creare un ObjectId in un documento incorporato come questo:

from bson.objectid import ObjectId 

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

'default = ObjectId' dovrebbe funzionare anche –

Problemi correlati