Det finns ingen $move
i MongoDB
. Med det sagt, den enklaste lösningen är en 2-fas strategi:
Den viktiga delen här, för att se till att allt är idempotent, är att inkludera det ursprungliga arraydokumentet i frågan för uppdateringen.
Givet ett dokument av följande form:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Låt säga att du vill flytta { a: 1, b: 1 }
till ett annat fält, kanske kallat someOtherArrayField
, skulle du vilja göra något liknande.
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 } })
Anledningen till att vi använder $elemMatch
är att vara säker på att fältet vi ska ta bort från arrayen inte har ändrats sedan vi först frågade efter dokumentet. I kombination med en $pull
det är inte heller absolut nödvändigt, men jag är vanligtvis överdrivet försiktig i dessa situationer. Om det inte finns någon parallellitet i din ansökan, och du bara har en applikationsinstans, är det inte strikt nödvändigt.
När vi nu kontrollerar det resulterande dokumentet får vi:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}