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.
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.
Mari kita perhatikan dua kasus di sini untuk disimpan: -
1) Memiliki _id dalam dokumen.
2) Tidak memiliki _id dalam dokumen.
Save()/ \
/ \
Having _id NotHaving _id
->Inthiscase save will do->It will do normal insertion
upsert to insert.Now in thiscase 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()/ \
/ \
DocHaving _id in collection DocNotHaving _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
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.
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
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.Simpan vs Pembaruan :
update
memodifikasi dokumen yang sudah ada yang cocok dengan parameter permintaan Anda. Jika tidak ada dokumen yang cocok, saat itulahupsert
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.sumber
Mari kita perhatikan dua kasus di sini untuk disimpan: -
1) Memiliki _id dalam dokumen.
2) Tidak memiliki _id dalam dokumen.
Mari kita perhatikan dua kasus di sini untuk dimasukkan: -
1) Memiliki _id dokumen dalam koleksi.
2) Tidak memiliki _id dokumen dalam koleksi.
sumber
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.sumber
Dengan memberi contoh
Simpan Apple
Simpan apel dengan _id dari apel yang disimpan sebelumnya
Sekarang apel yang kami simpan memiliki, warna diperbarui dari merah menjadi merah asli
Simpan apel dengan _id
Apple dimasukkan karena tidak ada apel dengan Object ID yang sama untuk melakukan pembaruan
Masukkan Orange
Oranye dimasukkan
Jadi save akan bertindak sebagai pembaruan jika disediakan dengan id objek, asalkan id objek sudah ada selain itu tidak memasukkan.
sumber
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.
sumber
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.
sumber
Pertimbangkan dokumen di bawah ini
jika db sudah berisi dokumen dengan _id: 1, maka
operasi save akan membuang pengecualian seperti di bawah ini
dan di mana sebagai operasi memasukkan, hanya akan menimpa dokumen.
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 MongoDBDalam hal ORACLE: mongo insert => Oracle masukkan mongo save => Oracle merge
sumber
db.<collection_name>.save(<Document>)
setara dengan Permintaan InsertOrUpdate.Sementara,
db.<collection_name>.insert(<Document>)
setara dengan hanya Masukkan Permintaan.sumber