Er is geen $move
in MongoDB
. Dat gezegd hebbende, de gemakkelijkste oplossing is een aanpak in twee fasen:
Het belangrijkste onderdeel hier, om ervoor te zorgen dat alles idempotent is, is om het originele arraydocument op te nemen in de query voor de update.
Gegeven een document van de volgende vorm:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Stel dat u { a: 1, b: 1 }
. wilt verplaatsen naar een ander veld, misschien genaamd someOtherArrayField
, zou je zoiets willen doen.
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 } })
De reden waarom we de $elemMatch
gebruiken
is om er zeker van te zijn dat het veld dat we gaan verwijderen uit de array niet is veranderd sinds we het document voor het eerst hebben opgevraagd. In combinatie met een $pull
het is ook niet strikt noodzakelijk, maar ik ben meestal overdreven voorzichtig in deze situaties. Als er geen parallellisme is in uw toepassing en u slechts één toepassingsinstantie heeft, is dit niet strikt noodzakelijk.
Als we nu het resulterende document controleren, krijgen we:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}