Was ist der Unterschied zwischen Speichern und Einfügen in Mongo DB?


Antworten:


146

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 _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.


8
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.
Rahul

1
Ab Version 2.6 hat save ein zweites Argument, das ein Dokument verwendet, das das Schreibproblem ausdrückt. docs.mongodb.org/manual/reference/method/db.collection.save
huggie

77

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:       

10
Diagramme der nächsten Ebene
John Spiteri

2
Upvoted für die Zeit, die benötigt wurde, um die Diagramme ordentlich zu zeichnen und zu präsentieren.
Fanbondi

36

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 _idFeld enthält.


13

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.


10

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.



3

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
Jack Blank

1

In Bezug auf ORACLE: mongo insert => Oracle insert mongo save => Oracle merge


1

db.<collection_name>.save(<Document>) entspricht der InsertOrUpdate-Abfrage.

Während db.<collection_name>.insert(<Document>)entspricht nur einfügen Abfrage.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.