No hay $move
en MongoDB
. Dicho esto, la solución más fácil es un enfoque de 2 fases:
La parte importante aquí, para asegurarse de que todo sea idempotente, es incluir el documento de matriz original en la consulta de la actualización.
Dado un documento de la siguiente forma:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Digamos que quieres mover { a: 1, b: 1 }
a un campo diferente, quizás llamado someOtherArrayField
, le gustaría hacer algo como.
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 } })
La razón por la que usamos $elemMatch
es asegurarnos de que el campo que estamos a punto de eliminar de la matriz no haya cambiado desde que consultamos el documento por primera vez. Cuando se combina con un $pull
tampoco es estrictamente necesario, pero normalmente soy demasiado cauteloso en estas situaciones. Si no hay paralelismo en su aplicación y solo tiene una instancia de aplicación, no es estrictamente necesario.
Ahora, cuando comprobamos el documento resultante, obtenemos:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}