Няма $move
в MongoDB
. Като се има предвид това, най-лесното решение е двуфазен подход:
Важната част тук, за да се уверите, че всичко е идемпотентно, е да включите оригиналния документ на масива в заявката за актуализация.
Даден е документ със следната форма:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Да приемем, че искате да преместите { a: 1, b: 1 }
към различно поле, може би наречено someOtherArrayField
, бихте искали да направите нещо подобно.
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 } })
Причината, поради която използваме $elemMatch
е да се уверим, че полето, което ще премахнем от масива, не се е променило, откакто направихме за първи път заявка към документа. Когато е свързан с $pull
също така не е строго необходимо, но обикновено съм прекалено предпазлив в тези ситуации. Ако няма паралелизъм във вашето приложение и имате само един екземпляр на приложението, това не е строго необходимо.
Сега, когато проверяваме получения документ, получаваме:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}