Was ist der Unterschied zwischen Speichern und Einfügen in Mongo DB? beide sehen gleich aus
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Was ist der Unterschied zwischen Speichern und Einfügen in Mongo DB? beide sehen gleich aus
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
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 .
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 upsert
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.
Betrachten wir die beiden Fälle hier zum Speichern: -
1) _id in doc haben.
2) Keine _id in doc.
Save ()
/ \
/ \
Having _id Not Having _id
->In this case save will do -> It will do normal insertion
upsert to insert.Now in this case 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()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
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.
Mit einem Beispiel
Speichern Sie einen Apple
db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "red",
"shape" : "round",
"name" : "apple"
}
Speichern Sie einen Apfel mit _id des zuvor gespeicherten Apfels
db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple",
"color":"real red","shape":"round"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Jetzt hat der Apfel, den wir gespeichert haben, die Farbe von Rot auf Echtrot aktualisiert
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
Speichern Sie einen Apfel mit _id
db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1,
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })
Apple wurde eingefügt, da es keinen Apple mit derselben Objekt-ID gibt, um ein Update durchzuführen
Fügen Sie eine Orange ein
db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })
Orange wird eingefügt
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
{
"_id" : ObjectId("53fa196d132c1f084b005cd7"),
"color" : "orange",
"shape" : "round",
"name" : "orange"
}
{
"_id" : ObjectId("55551809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
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):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Insert ist genau das, ein gerader Insert.
Betrachten Sie das folgende Dokument
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
Wenn db das Dokument bereits mit _id: 1 enthält, dann
Durch das Speichern wird die Ausnahme wie unten ausgelöst
E11000 duplicate key error index ...........
und wo als Einfügevorgang wird nur das Dokument überschrieben.
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
db.<collection_name>.save(<Document>)
entspricht der InsertOrUpdate-Abfrage.
Während db.<collection_name>.insert(<Document>)
entspricht nur einfügen Abfrage.