seperti judulnya, saya ingin melakukan pencarian (satu) untuk dokumen, dengan _id, dan jika tidak ada, sudah dibuat, lalu apakah ditemukan atau dibuat, apakah itu dikembalikan di callback.
Saya tidak ingin memperbaruinya jika ada, seperti yang telah saya baca findAndModify. Saya telah melihat banyak pertanyaan lain di Stackoverflow mengenai ini tetapi sekali lagi, tidak ingin memperbarui apa pun.
Saya tidak yakin apakah dengan membuat (tidak ada), BAHWA sebenarnya pembaruan yang dibicarakan semua orang, semuanya sangat membingungkan :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. Lihat dokumendb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) masukkan (upert) dokumen, Anda harus mempertimbangkan untuk menggunakandb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Ia mengembalikan{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
jika dokumen dimasukkan,{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
jika dokumen sudah ada.findOneAndUpdate
,findOneAndReplace
ataufindOneAndDelete
Versi Driver> 2
Menggunakan driver terbaru (> versi 2) , Anda akan menggunakan findOneAndUpdate karena
findAndModify
sudah tidak digunakan lagi. Metode baru mengambil 3 argumen, thefilter
,update
objek (yang berisi properti default Anda, yang harus disisipkan untuk objek baru), dan dioptions
mana Anda harus menentukan operasi upsert.Menggunakan sintaks promise, terlihat seperti ini:
sumber
returnOriginal
harusnyareturnNewDocument
saya pikir - docs.mongodb.com/manual/reference/method/…Agak kotor, tapi Anda bisa memasukkannya saja.
Pastikan bahwa kunci memiliki indeks unik di atasnya (jika Anda menggunakan _id tidak apa-apa, itu sudah unik).
Dengan cara ini, jika elemen sudah ada, ia akan mengembalikan pengecualian yang bisa Anda tangkap.
Jika tidak ada, dokumen baru akan disisipkan.
Diperbarui: penjelasan rinci tentang teknik ini pada Dokumentasi MongoDB
sumber
Inilah yang saya lakukan (driver Ruby MongoDB):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Ini akan memperbaruinya jika ada, dan memasukkannya jika tidak.
sumber