Tidak ada $move
di MongoDB
. Karena itu, solusi termudah adalah pendekatan 2 fase:
Bagian penting di sini, untuk memastikan semuanya idempoten, adalah menyertakan dokumen array asli dalam kueri pembaruan.
Diberikan dokumen dengan format berikut:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Katakanlah Anda ingin memindahkan { a: 1, b: 1 }
ke bidang yang berbeda, mungkin disebut someOtherArrayField
, Anda ingin melakukan sesuatu seperti.
var doc = db.col.findOne({_id: "foo"});
var arrayDocToMove = doc.arrayField[0];
db.col.update({_id: "foo", arrayField: { $elemMatch: arrayDocToMove} }, { $pull: { arrayField: arrayDocToMove }, $addToSet: { someOtherArrayField: arrayDocToMove } })
Alasan kami menggunakan $elemMatch
adalah untuk memastikan bahwa bidang yang akan kita hapus dari larik tidak berubah sejak pertama kali kita menanyakan dokumen. Saat digabungkan dengan $pull
itu juga tidak sepenuhnya diperlukan, tetapi saya biasanya terlalu berhati-hati dalam situasi ini. Jika tidak ada paralelisme dalam aplikasi Anda, dan Anda hanya memiliki satu instance aplikasi, itu tidak sepenuhnya diperlukan.
Sekarang ketika kami memeriksa dokumen yang dihasilkan, kami mendapatkan:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}