Dari satu sudut pandang jawabannya adalah "tidak" dan ada alasan yang sangat bagus untuk itu.
Secara umum, operasi "pembaruan" MongoDB dimaksudkan untuk bekerja di semua dokumen yang umumnya "banyak", oleh karena itu berarti apa pun yang cocok dengan kriteria. Jadi kasus umum di sini adalah apa pun yang Anda minta untuk diperbarui baik dalam bentuk tunggal atau dengan pilihan diperbarui atau tidak, tergantung pada apakah ada yang cocok.
Dalam konteks "Massal", banyak hal yang sama berlaku, karena ada kriteria yang cocok atau tidak, dalam hal ini Anda akan mendapatkan nilai yang dikembalikan untuk nMatched
dan nModified
masing-masing, karena ada juga kemungkinan bahwa dokumen "cocok" tidak benar-benar diperbarui di mana data yang ada untuk dimodifikasi sudah merupakan nilai yang menjadi target modifikasi.
Perbedaan terakhir antara nMatched
dan nModified
adalah alasan utama mengapa "Anda tidak dapat melakukan ini dengan andal" , karena tidak semua yang cocok harus diubah.
Namun Anda dapat membuat perkiraan nilai dalam hal membedakan antara tindakan "upsert" dan "pembaruan" yang sebenarnya. Itu tidak akan 100% akurat karena perbedaan yang dicatat, tetapi proses dasarnya adalah membandingkan daftar input Anda dengan nilai yang dikembalikan dari getUpsertedIds()
, yang merupakan panggilan yang valid.
Menghindari sintaks ES6 untuk seluruh dunia saat ini:
var upserted = result.getUpsertedIds(); // get this from the bulk result
upserted = upserted.map(function(up) { return up._id }); // filter out just the _id values
var modifiedIds = edges.map(function(edge) { // get _id only from source
return edge.id;
}).filter(function(edge) {
return upserted.indexOf(edge) == -1; // and return only non upserted
});
Di mana hasil yang dikembalikan dari .getUpsertedIds()
adalah larik objek yang berisi posisi "indeks" dari pembaruan massal dan _id
yang dihasilkan atau disediakan nilai "upsert".
[ { index: 0, _id: 1 } ]
Jadi, cocokkan daftar masukan Anda dengan daftar "yang dimasukkan" untuk melihat "apa yang tidak ada" , pada dasarnya mengembalikan hal-hal yang mungkin baru saja dimodifikasi. Tentu dengan catatan jika nilainya sudah sama dengan modifikasi, maka itu sama sekali bukan modifikasi.
Namun karena cara kerja API, itu yang akan Anda dapatkan.