Mongo DBでの保存と挿入の違いは何ですか?どちらも同じように見えます
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Mongo DBでの保存と挿入の違いは何ですか?どちらも同じように見えます
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
回答:
保存対挿入:
あなたの与えられた例では、動作は本質的に同じです。
save
「_id」パラメータを指定して渡された場合の動作は異なります。
保存の場合、ドキュメントにが含ま_id
れて_id
いる場合は、フィールドのコレクションに対するクエリがアップサートされます。含まれていない場合は、挿入されます。
指定された_id値を持つドキュメントが存在しない場合、save()メソッドはドキュメント内の指定されたフィールドで挿入を実行します。
指定された_id値を持つドキュメントが存在する場合、save()メソッドは更新を実行し、既存のレコードのすべてのフィールドをドキュメントのフィールドで置き換えます。
保存と更新:
update
クエリパラメータと一致する既存のドキュメントを変更します。そのような一致するドキュメントがない場合は、その時点で問題upsert
になります。
upsert : false
:そのようなドキュメントが存在しない場合は何も起こりませんupsert : true
:新しいドキュメントは、クエリパラメータと更新パラメータに等しい内容で作成されますsave
:query-paramsを許可しません。場合_id
に存在すると、一致するドキュメントが同じであり_id
、それはそれを置き換えます。_idが指定されていない場合、または一致するドキュメントがない場合は、ドキュメントを新しいドキュメントとして挿入します。
保存のために、ここで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:
例を挙げて
リンゴを救う
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がすでに存在する場合は、挿入を実行します。
以前に同じコレクションで使用されていたIDで「挿入」を使用しようとすると、重複キーエラーが発生します。同じコレクションに既にあるIDで「保存」を使用すると、更新/上書きされます。
あなたが本当のアップデートをしたいと思っているなら、私は「アップデート」を使うことを勧めます。コレクションに既に存在する同じIDを使用して保存する場合、更新は保存と同じ方法で上書きされません。
たとえば、 "x"と "y"の2つのフィールドがあり、両方を保持したいが "x"の値を変更したいとします。「保存」コマンドを選択し、以前の値のyを含めなかったか、保存にyがまったくなかった場合、yは同じ値を持たないか、そこに存在しなくなります。ただし、$ setを使用して更新することを選択し、更新ステートメントにxのみが含まれている場合、yには影響しません。
ここを見るとわかるように、saveメソッドは基本的にアップサートを行います(ドキュメントが見つかった場合は更新し、そうでない場合は挿入します)。
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
インサートはまさにストレートインサートです。
以下のドキュメントを検討してください
{ "_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
db.<collection_name>.save(<Document>)
InsertOrUpdateクエリと同等です。
一方、db.<collection_name>.insert(<Document>)
クエリの挿入と同じです。