MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Sposta un elemento da un array all'altro all'interno dello stesso documento MongoDB

Non ci sono $move in MongoDB . Detto questo, la soluzione più semplice è un approccio in 2 fasi:

  1. Interroga il documento
  2. Crea l'aggiornamento con un $pull e $push /$addToSet

La parte importante qui, per assicurarsi che tutto sia idempotente, è includere il documento dell'array originale nella query per l'aggiornamento.

Dato un documento della seguente forma:

{
    _id: "foo",
    arrayField: [
        {
            a: 1,
            b: 1
        },
        {
            a: 2,
            b: 1
        }
    ]
}

Diciamo che vuoi spostare { a: 1, b: 1 } in un campo diverso, magari chiamato someOtherArrayField , vorresti fare qualcosa del genere.

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

Il motivo per cui utilizziamo $elemMatch è per essere sicuri che il campo che stiamo per rimuovere dall'array non sia cambiato da quando abbiamo interrogato per la prima volta il documento. Se abbinato a un $pull inoltre non è strettamente necessario, ma in genere sono eccessivamente cauto in queste situazioni. Se non c'è parallelismo nella tua applicazione e hai solo un'istanza dell'applicazione, non è strettamente necessario.

Ora, quando controlliamo il documento risultante, otteniamo:

db.col.findOne()
{
        "_id" : "foo",
        "arrayField" : [
                {
                        "a" : 2,
                        "b" : 1
                }
        ],
        "someOtherArrayField" : [
                {
                        "a" : 1,
                        "b" : 1
                }
        ]
}