Mongo DBでの保存と挿入の違いは何ですか?


回答:


146

保存対挿入:

あなたの与えられた例では、動作は本質的に同じです。

save 「_id」パラメータを指定して渡された場合の動作は異なります。

保存の場合、ドキュメントにが含ま_idれて_idいる場合は、フィールドのコレクションに対するクエリがアップサートされます。含まれていない場合は、挿入されます。

指定された_id値を持つドキュメントが存在しない場合、save()メソッドはドキュメント内の指定されたフィールドで挿入を実行します。

指定された_id値を持つドキュメントが存在する場合、save()メソッドは更新を実行し、既存のレコードのすべてのフィールドをドキュメントのフィールドで置き換えます。


保存と更新

updateクエリパラメータと一致する既存のドキュメントを変更します。そのような一致するドキュメントがない場合は、その時点で問題upsertになります。

  • upsert : false :そのようなドキュメントが存在しない場合は何も起こりません
  • upsert : true :新しいドキュメントは、クエリパラメータと更新パラメータに等しい内容で作成されます

save:query-paramsを許可しません。場合_idに存在すると、一致するドキュメントが同じであり_id、それはそれを置き換えます。_idが指定されていない場合、または一致するドキュメントがない場合は、ドキュメントを新しいドキュメントとして挿入します。


8
どちらも構文が異なります。updateは複数の引数({condition}、{update to doc}、upsert、multi)を取りますが、saveは1つの引数のみを受け入れます(_idは条件付き引数のパラメーターです)。updateは任意の条件を受け入れることができますが、saveは、 _idフィールド。
Rahul、2014

1
バージョン2.6の時点で、saveには、書き込みの懸念を表すドキュメントを取得する2番目の引数があります。docs.mongodb.org/manual/reference/method/db.collection.save
huggie

77

保存のために、ここで2つのケースを考えてみましょう:-

1)ドキュメントに_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)コレクションにドキュメントの_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:       

10
次のレベルの図
John Spiteri 2016年

2
きちんと図を描いて提示するのにかかる時間に賛成。
fanbondi 2016年

36

save ドキュメントを挿入または更新します。

insert 挿入のみを行います。

しかし、あなたの場合、saveで提供されるドキュメントには_idフィールドがないため、同じことを行います。


13

例を挙げて

リンゴを救う

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を持つリンゴがないため、リンゴが挿入されました

オレンジを挿入

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がすでに存在する場合は、挿入を実行します。


10

以前に同じコレクションで使用されていたIDで「挿入」を使用しようとすると、重複キーエラーが発生します。同じコレクションに既にあるIDで「保存」を使用すると、更新/上書きされます。

あなたが本当のアップデートをしたいと思っているなら、私は「アップデート」を使うことを勧めます。コレクションに既に存在する同じIDを使用して保存する場合、更新は保存と同じ方法で上書きされません。

たとえば、 "x"と "y"の2つのフィールドがあり、両方を保持したいが "x"の値を変更したいとします。「保存」コマンドを選択し、以前の値のyを含めなかったか、保存にyがまったくなかった場合、yは同じ値を持たないか、そこに存在しなくなります。ただし、$ setを使用して更新することを選択し、更新ステートメントにxのみが含まれている場合、yには影響しません。



3

以下のドキュメントを検討してください

{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }

dbに_id:1のドキュメントがすでに含まれている場合、

保存操作は以下のような例外をスローします

E11000 duplicate key error index ...........

そして、挿入操作として、ドキュメントをオーバーライドするだけです。


db.collection.save()同じ_idのドキュメントがデータベースにすでに存在する場合、メソッドはドキュメントを更新します。同じ_idのドキュメントがデータベースにすでに存在する場合、saveメソッドはドキュメントを新しいドキュメントに完全に置き換えます。本から-Pro MongoDB Development
jack blank


1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.