Es gibt kein $move
in MongoDB
. Davon abgesehen ist die einfachste Lösung ein 2-Phasen-Ansatz:
Der wichtige Teil hier, um sicherzustellen, dass alles idempotent ist, besteht darin, das ursprüngliche Array-Dokument in die Abfrage für das Update aufzunehmen.
Gegeben sei ein Dokument der folgenden Form:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Angenommen, Sie möchten { a: 1, b: 1 }
verschieben in ein anderes Feld, vielleicht someOtherArrayField
genannt , würden Sie so etwas tun wollen.
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 } })
Der Grund, warum wir $elemMatch
verwenden
ist sicherzustellen, dass sich das Feld, das wir aus dem Array entfernen werden, nicht geändert hat, seit wir das Dokument zum ersten Mal abgefragt haben. Bei Kopplung mit einem $pull
Es ist auch nicht unbedingt notwendig, aber ich bin in solchen Situationen normalerweise übervorsichtig. Wenn es in Ihrer Anwendung keine Parallelität gibt und Sie nur eine Anwendungsinstanz haben, ist dies nicht unbedingt erforderlich.
Wenn wir nun das resultierende Dokument überprüfen, erhalten wir:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}