MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mover um elemento de um array para outro dentro do mesmo documento MongoDB


Não há $move no MongoDB . Dito isto, a solução mais fácil é uma abordagem de 2 fases:
  1. Consulte o documento
  2. Faça a atualização com um $pull e $push /$addToSet

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
                }
        ]
}