Apa perbedaan antara simpan dan masukkan dalam Mongo DB?

149

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"})
pengguna2093576
sumber
1
fyi save () sekarang tidak digunakan lagi di pymongo.
Gabriel Fair

Jawaban:

147

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 _idlapangan, 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 :

updatememodifikasi dokumen yang sudah ada yang cocok dengan parameter permintaan Anda. Jika tidak ada dokumen yang cocok, saat itulah upsertmuncul gambar.

  • upsert : false : Tidak ada yang terjadi ketika tidak ada dokumen seperti itu
  • upsert : true : Doc baru dibuat dengan konten yang sama dengan params kueri dan memperbarui params

save: Tidak mengizinkan parram permintaan. jika _idada 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.

Rahul
sumber
8
keduanya memiliki sintaks yang berbeda. Pembaruan memerlukan banyak argumen ({kondisi}, {perbarui ke doc}, lebih tinggi, multi) sedangkan save hanya menerima satu argumen (_id menjadi parameter untuk argumen bersyarat) .pemutakhiran dapat menerima kondisi apa pun tetapi menyimpan memiliki batasan kondisi hanya pada bidang _id.
Rahul
1
Pada versi 2.6, save memiliki argumen kedua untuk mengambil dokumen yang mengungkapkan masalah penulisan. docs.mongodb.org/manual/reference/method/db.collection.save
huggie
79

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:       
squiroid
sumber
10
Diagram tingkat berikutnya
John Spiteri
2
Terpilih untuk waktu yang dibutuhkan untuk menggambar dan menyajikan diagram dengan rapi.
fanbondi
36

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

Aurélien B
sumber
13

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.

Abhi
sumber
10

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.

RoganRicheart
sumber
3

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.

Bravo
sumber
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
jack blank
1

Dalam hal ORACLE: mongo insert => Oracle masukkan mongo save => Oracle merge

Jagan
sumber
1

db.<collection_name>.save(<Document>) setara dengan Permintaan InsertOrUpdate.

Sementara, db.<collection_name>.insert(<Document>)setara dengan hanya Masukkan Permintaan.

Vijet Badigannavar
sumber