Apa perbedaan antara simpan dan masukkan dalam Mongo DB? keduanya terlihat sama
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Apa perbedaan antara simpan dan masukkan dalam Mongo DB? keduanya terlihat sama
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Jawaban:
Simpan Vs Masukkan:
Dalam contoh yang Anda berikan, perilaku pada dasarnya sama.
save
berperilaku berbeda jika dilewatkan dengan parameter "_id".
Untuk menyimpan, Jika dokumen berisi _id
, itu akan meminta kueri koleksi di _id
lapangan, Jika tidak, itu akan menyisipkan.
Jika dokumen tidak ada dengan nilai _id yang ditentukan, metode save () melakukan penyisipan dengan bidang yang ditentukan dalam dokumen.
Jika ada dokumen dengan nilai _id yang ditentukan, metode save () melakukan pembaruan, mengganti semua bidang dalam catatan yang ada dengan bidang dari dokumen.
Simpan vs Pembaruan :
update
memodifikasi dokumen yang sudah ada yang cocok dengan parameter permintaan Anda. Jika tidak ada dokumen yang cocok, saat itulah upsert
muncul gambar.
upsert : false
: Tidak ada yang terjadi ketika tidak ada dokumen seperti ituupsert : true
: Doc baru dibuat dengan konten yang sama dengan params kueri dan memperbarui paramssave
: Tidak mengizinkan parram permintaan. jika _id
ada dan ada dokumen yang cocok dengan yang sama _id
, itu menggantikannya. Ketika tidak ada _id yang ditentukan / tidak ada dokumen yang cocok, itu memasukkan dokumen sebagai yang baru.
Mari kita perhatikan dua kasus di sini untuk disimpan: -
1) Memiliki _id dalam dokumen.
2) Tidak memiliki _id dalam dokumen.
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.
Mari kita perhatikan dua kasus di sini untuk dimasukkan: -
1) Memiliki _id dokumen dalam koleksi.
2) Tidak memiliki _id dokumen dalam koleksi.
Insert()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
save
masukkan atau perbarui dokumen.
insert
tidak hanya penyisipan.
Tetapi dalam kasus Anda, itu akan melakukan hal yang sama, karena dokumen yang disediakan di save tidak memiliki _id
bidang.
Dengan memberi contoh
Simpan 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"
}
Simpan apel dengan _id dari apel yang disimpan sebelumnya
db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple",
"color":"real red","shape":"round"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Sekarang apel yang kami simpan memiliki, warna diperbarui dari merah menjadi merah asli
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
Simpan apel dengan _id
db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1,
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })
Apple dimasukkan karena tidak ada apel dengan Object ID yang sama untuk melakukan pembaruan
Masukkan Orange
db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })
Oranye dimasukkan
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"
}
Jadi save akan bertindak sebagai pembaruan jika disediakan dengan id objek, asalkan id objek sudah ada selain itu tidak memasukkan.
Jika Anda mencoba menggunakan "masukkan" dengan ID yang sebelumnya digunakan dalam koleksi yang sama Anda akan mendapatkan kesalahan kunci duplikat. Jika Anda menggunakan "simpan" dengan ID yang sudah ada di koleksi yang sama, itu akan diperbarui / ditimpa.
Jika Anda ingin melakukan pembaruan yang benar, saya sarankan menggunakan "pembaruan". Pembaruan tidak akan menimpa dengan cara Simpan jika Anda Menyimpan menggunakan ID yang sama yang sudah ada dalam koleksi.
Misalnya Anda memiliki dua bidang "x" dan "y" dan Anda ingin mempertahankan keduanya tetapi mengubah nilai "x". Jika Anda memilih perintah "simpan" dan tidak memasukkan y dengan nilai sebelumnya atau tidak memiliki y sama sekali dalam penyimpanan Anda, maka y tidak akan lagi memiliki nilai yang sama atau berada di sana. Namun jika Anda memilih untuk memperbarui menggunakan $ set dan hanya memiliki x termasuk dalam pernyataan pembaruan Anda, Anda tidak akan mempengaruhi y.
Seperti yang Anda lihat di sini, metode simpan pada dasarnya akan melakukan upert (perbarui jika menemukan dokumen, masukkan sebaliknya):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Masukkan hanya itu, masukkan lurus.
Pertimbangkan dokumen di bawah ini
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
jika db sudah berisi dokumen dengan _id: 1, maka
operasi save akan membuang pengecualian seperti di bawah ini
E11000 duplicate key error index ...........
dan di mana sebagai operasi memasukkan, hanya akan menimpa dokumen.
db.collection.save()
Metode memperbarui dokumen jika dokumen dengan _id yang sama sudah ada dalam database. Ketika dokumen dengan _id yang sama sudah ada dalam database, metode save sepenuhnya menggantikan dokumen dengan dokumen baru. Dari buku- Pengembangan Pro MongoDB
db.<collection_name>.save(<Document>)
setara dengan Permintaan InsertOrUpdate.
Sementara, db.<collection_name>.insert(<Document>)
setara dengan hanya Masukkan Permintaan.