2013-04-25 18 views
5

Rozumiem, że nie można aktualizować _id na istniejącym dokumencie mongodb.Aktualizacja Mongodb. setOnInsert Mod on _id not allowed

Ale czy istnieje powód, dla którego nie możemy użyć go w upsert w części 'setOnInsert'? Ponieważ jest "na wkładce", więc nie jest aktualizacją.

Moja oczekiwane wykorzystanie jest taka:

db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}}); 

Jest to błąd albo ja czegoś brakuje?

+1

gdzie jest flaga upsert? po prostu wyłącz opcję setOnInsert, a właściwa rzecz się wydarzy. db.myCol.update ({_ id: 12345}, {$ set: {myValue: 'hi'}}) –

+1

Tak, masz rację, zapomniałem dołączyć flagi upsert. Wygląda na to, że automatycznie włącza część znalezienia do wstawki, jeśli jest to upsert. Dzięki :) –

+0

dokładnie. Czy chcesz napisać to jako odpowiedź, czy też powinienem? –

Odpowiedz

9

MongoDB używa części "zapytanie" dla zapytania upsert jako części zestawu, co oznacza, że ​​nie trzeba określać _id w części zestawu, która ma określać własny _id.

uwaga: moje zapytanie powyżej również miało mały błąd, który był brakującą flagą upsert.

Jest to poprawne zapytania:

db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true}); 

Jeśli rekord nie istnieje, ta kwerenda będzie wstawić rekord, który wygląda tak:

{_id:12345,myValue:'hi'} 
3

Naprawdę, jest to błąd w Mongo poprawione w wersji rozwojowej 2.5.4 lub zwolnić 2.6.0:

https://jira.mongodb.org/browse/SERVER-9958

Po ustaleniu tego, uważam, że powinno to działać zgodnie z oczekiwaniami. W ogólnym przypadku zapytanie o aktualizację niekoniecznie musi określać pole "_id".

+0

Jeśli jest to błąd, nadal jest obecny w wersji 3.4. Próbowałem użyć $ setOnInsert z {_id}, ale wyrzucił Mod on nie jest dozwolony. –

Powiązane problemy