Não há
$move
no MongoDB
. Dito isto, a solução mais fácil é uma abordagem de 2 fases:A parte importante aqui, para garantir que tudo seja idempotente, é incluir o documento original do array na consulta para a atualização.
Dado um documento da seguinte forma:
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Digamos que você queira mover
{ a: 1, b: 1 }
para um campo diferente, talvez chamado de someOtherArrayField
, você gostaria de fazer 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 } })
O motivo pelo qual usamos o
$elemMatch
é ter certeza de que o campo que estamos prestes a remover do array não mudou desde que consultamos o documento pela primeira vez. Quando acoplado a um $pull
também não é estritamente necessário, mas normalmente sou excessivamente cauteloso nessas situações. Se não houver paralelismo em seu aplicativo e você tiver apenas uma instância de aplicativo, isso não será estritamente necessário. Agora, quando verificamos o documento resultante, obtemos:
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}