2011-01-23 2 views
6

Ho un documento nella forma seguente:MongoDB - creare doc, se non esiste, altrimenti spinta alla gamma

{ 
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"), 
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0", 
"events" : [ 
     { 
       "profile" : 10, 
       "data" : "....." 
     } 
     { 
       "profile" : 10, 
       "data" : "....." 
     } 
     { 
       "profile" : 20, 
       "data" : "....." 
     } 
     ... 
    ] 
} 

mi piacerebbe avere una sorta di upsert dichiarazione. È necessario aggiungere uno event all'array events per user_id nel caso esista già un documento di questo tipo, altrimenti è necessario creare il documento con l'elemento event.

Può essere fatto?

risposta

13

Si può fare upserts a Mongo, vedere "Upserts con modificatori" dalla Mongo doc:

È possibile utilizzare upsert con un modificatore operazione. In tal caso, i modificatori verranno applicati al membro di criteri di aggiornamento e verrà inserito l'oggetto risultante .

La query è necessario sarà simile:

db.events.update({ "user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0" }, 
{ $push : { "events" : { "profile" : 10, "data" : "X"}}}, {"upsert" : true}); 
+1

forse sto utilizzando una versione diversa, ma con un solo vero come l'ultimo parametro aggiornamento non funziona. Ho dovuto inserire {upsert: true} come argomento. –

+0

Hai ragione Artur. Aggiornato. Grazie per aver notato –

+0

@Javier Ferrero L'esempio mostra solo $ push, che dire se ci sono campi come user_type dopo user_id deve anche essere aggiornato ..? –