173

Mongo DBでの保存と挿入の違いは何ですか? どっちも同じに見える

db.users.save({username:"google",password:"google123"})

db.users.insert({username:"google",password:"google123"})
4

9 に答える 9

107

ここで、save の 2 つのケースを考えてみましょう:-

1) doc に _id を持つ。

2) ドキュメントに _id がありません。

                        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.

ここで挿入の 2 つのケースを考えてみましょう:-

1) コレクションに doc の _id を持つ。

2) コレクションにドキュメントの _id がありません。

                        Insert()
                       /        \
                      /          \

   Doc Having _id in collection    Doc Not Having _id 
  ->  E11000 duplicate key     ->Insert a new doc inside the collection.
      error index:       
于 2015-03-31T05:59:49.060 に答える
14

例を挙げると

りんごを救う

db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })

db.fruit.find();

{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "red",
    "shape" : "round",
    "name" : "apple"
}

以前に保存されたリンゴの _id でリンゴを保存します

db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple", 
"color":"real red","shape":"round"})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

保存したリンゴの色が赤から真の赤に更新されました

db.fruit.find();
{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "real red",
    "shape" : "round",
    "name" : "apple"
}

_id でリンゴを保存する

db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})

    WriteResult({ "nMatched" : 0, "nUpserted" : 1, 
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })

更新を行うための同じオブジェクト ID を持つ Apple がないため、Apple が挿入されました

オレンジを入れる

db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })

オレンジが挿入されています

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"
}

そのため、オブジェクト ID が指定されている場合、save は更新として機能します。オブジェクト ID が既に存在している場合、それ以外の場合は挿入が行われます。

于 2014-08-24T17:12:05.013 に答える
1

ORACLE に関して: mongo insert => Oracle insert mongo save => Oracle merge

于 2014-02-17T12:05:04.507 に答える
1

db.<collection_name>.save(<Document>)InsertOrUpdate クエリと同等です。

一方、db.<collection_name>.insert(<Document>)挿入クエリと同等です。

于 2015-12-15T07:11:33.957 に答える