Jadi Anda benar bahwa $pull
operator melakukan persis seperti yang dikatakan dokumentasi karena argumennya sebenarnya adalah "permintaan" yang digunakan untuk mencocokkan elemen yang akan dihapus.
Jika konten array Anda kebetulan selalu memiliki elemen di posisi "pertama" seperti yang Anda tunjukkan, maka $pop
operator sebenarnya menghapus elemen pertama itu.
Dengan driver simpul dasar:
collection.findOneAndUpdate(
{ "array.0": "bird" }, // "array.0" is matching the value of the "first" element
{ "$pop": { "array": -1 } },
{ "returnOriginal": false },
function(err,doc) {
}
);
Dengan luwak argumen untuk mengembalikan dokumen yang dimodifikasi berbeda:
MyModel.findOneAndUpdate(
{ "array.0": "bird" },
{ "$pop": { "array": -1 } },
{ "new": true },
function(err,doc) {
}
);
Namun keduanya tidak banyak berguna jika posisi larik item "pertama" yang dihapus tidak diketahui.
Untuk pendekatan umum di sini Anda memerlukan pembaruan "dua", menjadi satu untuk mencocokkan item pertama dan menggantinya dengan sesuatu yang unik untuk dihapus, dan yang kedua untuk benar-benar menghapus item yang dimodifikasi itu.
Ini jauh lebih sederhana jika menerapkan pembaruan sederhana dan tidak meminta dokumen yang dikembalikan, dan juga dapat dilakukan secara massal di seluruh dokumen. Ini juga membantu untuk menggunakan sesuatu seperti async.series untuk menghindari panggilan Anda bersarang:
async.series(
[
function(callback) {
collection.update(
{ "array": "bird" },
{ "$unset": { "array.$": "" } },
{ "multi": true }
callback
);
},
function(callback) {
collection.update(
{ "array": null },
{ "$pull": { "array": null } },
{ "multi": true }
callback
);
}
],
function(err) {
// comes here when finished or on error
}
);
Jadi gunakan $unset
di sini dengan posisi $
operator mengizinkan item "pertama" diubah menjadi null
. Kemudian query berikutnya dengan $pull
hapus saja null
entri dari larik.
Begitulah cara Anda menghapus kemunculan nilai "pertama" dengan aman dari sebuah array. Untuk menentukan apakah array itu berisi lebih dari satu nilai yang sama adalah pertanyaan lain.