Neexistuje žádný $move
v MongoDB
. Jak již bylo řečeno, nejjednodušším řešením je dvoufázový přístup:
Důležitou součástí, aby bylo zajištěno, že je vše idempotentní, je zahrnout původní dokument pole do dotazu na aktualizaci.
Předán dokument v následující podobě:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Řekněme, že chcete přesunout { a: 1, b: 1 }
do jiného pole, možná nazvaného someOtherArrayField
, chtěli byste udělat něco jako.
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 } })
Důvod, proč používáme $elemMatch
je ujistit se, že pole, které se chystáme odstranit z pole, se nezměnilo od doby, kdy jsme poprvé dotazovali dokument. Ve spojení s $pull
také to není nezbytně nutné, ale v těchto situacích jsem obvykle příliš opatrný. Pokud ve vaší aplikaci není paralelismus a máte pouze jednu instanci aplikace, není to nezbytně nutné.
Nyní, když zkontrolujeme výsledný dokument, dostaneme:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}