sql >> Base de Datos >  >> NoSQL >> MongoDB

Mover un elemento de una matriz a otra dentro del mismo documento MongoDB

No hay $move en MongoDB . Dicho esto, la solución más fácil es un enfoque de 2 fases:

  1. Consultar el documento
  2. Elabore la actualización con un $pull y $push /$addToSet

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