Der er ingen $move
i MongoDB
. Når det er sagt, er den nemmeste løsning en 2-faset tilgang:
Den vigtige del her, for at sikre, at alt er idempotent, er at inkludere det originale array-dokument i forespørgslen til opdateringen.
Givet et dokument af følgende form:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Lad os sige, at du vil flytte { a: 1, b: 1 }
til et andet felt, måske kaldet someOtherArrayField
, vil du gerne gøre noget lignende.
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 } })
Grunden til at vi bruger $elemMatch
er at være sikker på, at det felt, vi er ved at fjerne fra arrayet, ikke har ændret sig, siden vi første gang forespurgte dokumentet. Når det kombineres med en $pull
det er heller ikke strengt nødvendigt, men jeg er typisk for forsigtig i disse situationer. Hvis der ikke er nogen parallelitet i din ansøgning, og du kun har én ansøgningsinstans, er det ikke strengt nødvendigt.
Når vi nu tjekker det resulterende dokument, får vi:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}