2011-01-23 9 views
6

Mam dokument w następującej formie:MongoDB - tworzenie dokumentu, jeśli nie istnieje, inny impuls do tablicy

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

chciałbym mieć jakiś upsert oświadczeniu. Musi dodać event do tablicy events dla user_id na wypadek, gdyby istniał już taki dokument, w przeciwnym razie musi utworzyć dokument z elementem event.

Czy to można zrobić?

Odpowiedz

13

Można zrobić upserts w Mongo, patrz "Upserts z modyfikatorami" z Mongo doc:

Można użyć upsert z modyfikatorem operacji. W takim przypadku modyfikatory zostaną zastosowane do elementu kryteriów aktualizacji , a obiekt wynikowy zostanie wstawiony.

Zapytanie trzeba będzie wyglądać następująco:

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

Może używam innej wersji, ale z prawdą tylko jako ostatni parametr aktualizacji nie działa. Jako argument musiałem wstawić {upsert: true}. –

+0

Masz rację Artur. Zaktualizowano. Dzięki za uwagę: –

+0

@Javier Ferrero Przykład pokazuje tylko $ push, a co jeśli istnieją pola typu user_type po user_id również musi zostać zaktualizowany ..? –

Powiązane problemy