MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verschieben Sie ein Element von einem Array in ein anderes innerhalb desselben MongoDB-Dokuments

Es gibt kein $move in MongoDB . Davon abgesehen ist die einfachste Lösung ein 2-Phasen-Ansatz:

  1. Dokument abfragen
  2. Erstellen Sie das Update mit einem $pull und $push /$addToSet

Der wichtige Teil hier, um sicherzustellen, dass alles idempotent ist, besteht darin, das ursprüngliche Array-Dokument in die Abfrage für das Update aufzunehmen.

Gegeben sei ein Dokument der folgenden Form:

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

Angenommen, Sie möchten { a: 1, b: 1 } verschieben in ein anderes Feld, vielleicht someOtherArrayField genannt , würden Sie so etwas tun wollen.

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

Der Grund, warum wir $elemMatch verwenden ist sicherzustellen, dass sich das Feld, das wir aus dem Array entfernen werden, nicht geändert hat, seit wir das Dokument zum ersten Mal abgefragt haben. Bei Kopplung mit einem $pull Es ist auch nicht unbedingt notwendig, aber ich bin in solchen Situationen normalerweise übervorsichtig. Wenn es in Ihrer Anwendung keine Parallelität gibt und Sie nur eine Anwendungsinstanz haben, ist dies nicht unbedingt erforderlich.

Wenn wir nun das resultierende Dokument überprüfen, erhalten wir:

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