In Ihren Beispielen ist das Verhalten im Wesentlichen dasselbe.
save verhält sich anders, wenn es mit einem "_id" -Parameter übergeben wird.
Zum Speichern: Wenn das Dokument enthält _id, wird die Abfrage der Sammlung auf dem _idFeld aktualisiert. Wenn nicht, wird es eingefügt .
Wenn ein Dokument mit dem angegebenen Wert _id nicht vorhanden ist, führt die Methode save () eine Einfügung mit den angegebenen Feldern im Dokument durch.
Wenn ein Dokument mit dem angegebenen Wert _id vorhanden ist, führt die Methode save () eine Aktualisierung durch und ersetzt alle Felder im vorhandenen Datensatz durch die Felder aus dem Dokument.
Speichern gegen Aktualisieren :
updateÄndert ein vorhandenes Dokument, das mit Ihren Abfrageparametern übereinstimmt. Wenn es kein solches passendes Dokument gibt, wird es upsertim Bild angezeigt.
upsert : false : Nichts passiert, wenn kein solches Dokument vorhanden ist
upsert : true : Neues Dokument wird mit Inhalten erstellt, die Abfrageparametern und Aktualisierungsparametern entsprechen
save: Erlaubt keine Abfrageparameter. Wenn _idvorhanden und ein übereinstimmendes Dokument vorhanden ist _id, wird es ersetzt. Wenn keine _id angegeben / kein übereinstimmendes Dokument angegeben ist, wird das Dokument als neues Dokument eingefügt.
beide haben unterschiedliche Syntax. Das Update akzeptiert mehrere Argumente ({Bedingung}, {Update auf Dokument}, Upsert, Multi), während das Speichern nur ein Argument akzeptiert (_id ist der Parameter für das bedingte Argument). Das Update kann jede Bedingung akzeptieren, aber das Speichern hat die Einschränkung der Bedingung nur für das _id Feld.
Betrachten wir die beiden Fälle hier zum Speichern: -
1) _id in doc haben.
2) Keine _id in doc.
Save()/ \
/ \
Having _id NotHaving _id
->Inthiscase save will do->It will do normal insertion
upsert to insert.Now in thiscase as insert()do.
what that means, it means
take the document and replace
the complete document having same
_id.
Betrachten wir die beiden Fälle hier zum Einfügen: -
1) _id des Dokuments in der Sammlung haben.
2) Keine _id des Dokuments in der Sammlung.
Insert()/ \
/ \
DocHaving _id in collection DocNotHaving _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
Das Speichern wirkt also als Aktualisierung, wenn es mit einer Objekt-ID geliefert wird, vorausgesetzt, die Objekt-ID ist bereits vorhanden, andernfalls wird eine Einfügung durchgeführt.
Wenn Sie versuchen, "Einfügen" mit einer ID zu verwenden, die zuvor in derselben Sammlung verwendet wurde, wird ein doppelter Schlüsselfehler angezeigt. Wenn Sie "Speichern" mit einer ID verwenden, die sich bereits in derselben Sammlung befindet, wird diese aktualisiert / überschrieben.
Wenn Sie ein echtes Update durchführen möchten, würde ich die Verwendung von "Update" empfehlen. Das Update wird nicht wie beim Speichern überschrieben, wenn Sie mit derselben ID speichern, die sich bereits in der Sammlung befindet.
Zum Beispiel haben Sie zwei Felder "x" und "y" und Sie möchten beide behalten, aber den Wert von "x" ändern. Wenn Sie den Befehl "Speichern" gewählt haben und y nicht mit dem vorherigen Wert aufgenommen haben oder y überhaupt nicht in Ihrem Speichern haben, hat y nicht mehr den gleichen Wert oder ist dort. Wenn Sie sich jedoch für ein Update mit $ set entschieden haben und nur x in Ihrer Update-Anweisung enthalten ist, hat dies keine Auswirkungen auf y.
Wie Sie hier sehen können, führt die Speichermethode im Wesentlichen einen Upsert durch (Aktualisierung, wenn das Dokument gefunden wird, anderweitig einfügen):
db.collection.save()Die Methode aktualisiert das Dokument, wenn bereits ein Dokument mit derselben _id in der Datenbank vorhanden ist. Wenn in der Datenbank bereits ein Dokument mit derselben _id vorhanden ist, ersetzt die Speichermethode das Dokument vollständig durch das neue Dokument. Aus dem Buch - Pro MongoDB Development
Jack Blank
1
In Bezug auf ORACLE: mongo insert => Oracle insert mongo save => Oracle merge
Antworten:
Speichern gegen Einfügen:
In Ihren Beispielen ist das Verhalten im Wesentlichen dasselbe.
save
verhält sich anders, wenn es mit einem "_id" -Parameter übergeben wird.Zum Speichern: Wenn das Dokument enthält
_id
, wird die Abfrage der Sammlung auf dem_id
Feld aktualisiert. Wenn nicht, wird es eingefügt .Speichern gegen Aktualisieren :
update
Ändert ein vorhandenes Dokument, das mit Ihren Abfrageparametern übereinstimmt. Wenn es kein solches passendes Dokument gibt, wird esupsert
im Bild angezeigt.upsert : false
: Nichts passiert, wenn kein solches Dokument vorhanden istupsert : true
: Neues Dokument wird mit Inhalten erstellt, die Abfrageparametern und Aktualisierungsparametern entsprechensave
: Erlaubt keine Abfrageparameter. Wenn_id
vorhanden und ein übereinstimmendes Dokument vorhanden ist_id
, wird es ersetzt. Wenn keine _id angegeben / kein übereinstimmendes Dokument angegeben ist, wird das Dokument als neues Dokument eingefügt.quelle
Betrachten wir die beiden Fälle hier zum Speichern: -
1) _id in doc haben.
2) Keine _id in doc.
Betrachten wir die beiden Fälle hier zum Einfügen: -
1) _id des Dokuments in der Sammlung haben.
2) Keine _id des Dokuments in der Sammlung.
quelle
save
Dokument einfügen oder aktualisieren.insert
macht nur eine Einfügung.In Ihrem Fall wird dies jedoch genauso sein, da das in save bereitgestellte Dokument kein
_id
Feld enthält.quelle
Mit einem Beispiel
Speichern Sie einen Apple
Speichern Sie einen Apfel mit _id des zuvor gespeicherten Apfels
Jetzt hat der Apfel, den wir gespeichert haben, die Farbe von Rot auf Echtrot aktualisiert
Speichern Sie einen Apfel mit _id
Apple wurde eingefügt, da es keinen Apple mit derselben Objekt-ID gibt, um ein Update durchzuführen
Fügen Sie eine Orange ein
Orange wird eingefügt
Das Speichern wirkt also als Aktualisierung, wenn es mit einer Objekt-ID geliefert wird, vorausgesetzt, die Objekt-ID ist bereits vorhanden, andernfalls wird eine Einfügung durchgeführt.
quelle
Wenn Sie versuchen, "Einfügen" mit einer ID zu verwenden, die zuvor in derselben Sammlung verwendet wurde, wird ein doppelter Schlüsselfehler angezeigt. Wenn Sie "Speichern" mit einer ID verwenden, die sich bereits in derselben Sammlung befindet, wird diese aktualisiert / überschrieben.
Wenn Sie ein echtes Update durchführen möchten, würde ich die Verwendung von "Update" empfehlen. Das Update wird nicht wie beim Speichern überschrieben, wenn Sie mit derselben ID speichern, die sich bereits in der Sammlung befindet.
Zum Beispiel haben Sie zwei Felder "x" und "y" und Sie möchten beide behalten, aber den Wert von "x" ändern. Wenn Sie den Befehl "Speichern" gewählt haben und y nicht mit dem vorherigen Wert aufgenommen haben oder y überhaupt nicht in Ihrem Speichern haben, hat y nicht mehr den gleichen Wert oder ist dort. Wenn Sie sich jedoch für ein Update mit $ set entschieden haben und nur x in Ihrer Update-Anweisung enthalten ist, hat dies keine Auswirkungen auf y.
quelle
Wie Sie hier sehen können, führt die Speichermethode im Wesentlichen einen Upsert durch (Aktualisierung, wenn das Dokument gefunden wird, anderweitig einfügen):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Insert ist genau das, ein gerader Insert.
quelle
Betrachten Sie das folgende Dokument
Wenn db das Dokument bereits mit _id: 1 enthält, dann
Durch das Speichern wird die Ausnahme wie unten ausgelöst
und wo als Einfügevorgang wird nur das Dokument überschrieben.
quelle
db.collection.save()
Die Methode aktualisiert das Dokument, wenn bereits ein Dokument mit derselben _id in der Datenbank vorhanden ist. Wenn in der Datenbank bereits ein Dokument mit derselben _id vorhanden ist, ersetzt die Speichermethode das Dokument vollständig durch das neue Dokument. Aus dem Buch - Pro MongoDB DevelopmentIn Bezug auf ORACLE: mongo insert => Oracle insert mongo save => Oracle merge
quelle
db.<collection_name>.save(<Document>)
entspricht der InsertOrUpdate-Abfrage.Während
db.<collection_name>.insert(<Document>)
entspricht nur einfügen Abfrage.quelle