2013-04-25 10 views
5

Ich verstehe die Tatsache, dass Sie _id auf einem vorhandenen mongodb Dokument nicht aktualisieren können.Mongodb Aktualisierung. setOnInsert Mod für _id nicht erlaubt

Aber gibt es einen Grund, warum wir es nicht in einem upsert im 'setOnInsert' Teil verwenden können? Da es sich um eine Einfügung handelt, ist es kein Update. diese

ist mein erwartete Nutzung:

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

Ist das ein Bug oder bin ich etwas fehlt?

+1

wo ist das upsert Flag? lassen Sie setOnInsert einfach ausgeschaltet und das Richtige wird passieren. db.myCol.update ({_ id: 12345}, {$ set: {myValue: 'hi'}}) –

+1

Ja, du hast recht, ich habe vergessen, das upsert Flag einzufügen. Anscheinend fügt es automatisch den Fundteil zum Einsatz ein, wenn es ein Upsert ist. Danke :) –

+0

genau. Willst du es als Antwort aufschreiben oder soll ich? –

Antwort

9

MongoDB verwendet den 'query' Teil für eine upsert Abfrage als Teil der Menge, was bedeutet, dass Sie die _id nicht in der Menge angeben müssen, in der Sie Ihre eigene _id angeben möchten.

hinweis: meine abfrage oben hatte auch einen kleinen fehler, der das fehlende upsert flag war.

Dies ist die richtige Abfrage:

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

Wenn der Datensatz diese Abfrage nicht vorhanden ist, wird ein Datensatz einfügen, die wie folgt aussieht:

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

Wirklich, das ist ein Fehler in mongo in Entwicklungsversion 2.5.4 fixiert oder Release 2.6.0:

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

Sobald das behoben ist, sollte dies meiner Meinung nach funktionieren. Im allgemeinen Fall wird die Abfrage für die Aktualisierung nicht unbedingt ein Feld "_id" angeben.

+0

Wenn das ein Fehler ist, ist es immer noch in 3.4 vorhanden. Ich habe versucht, $ setOnInsert mit der {_id} zu verwenden, aber es warf die Mod auf _id nicht erlaubt zu mir. –

Verwandte Themen