MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Déplacer un élément d'un tableau à un autre dans le même document MongoDB

Il n'y a pas de $move dans MongoDB . Cela étant dit, la solution la plus simple est une approche en 2 phases :

  1. Interroger le document
  2. Créez la mise à jour avec un $pull et $push /$addToSet

La partie importante ici, pour s'assurer que tout est idempotent, est d'inclure le document de tableau d'origine dans la requête pour la mise à jour.

Soit un document de la forme suivante :

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

Disons que vous voulez déplacer { a: 1, b: 1 } à un champ différent, peut-être appelé someOtherArrayField , vous voudriez faire quelque chose comme.

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 raison pour laquelle nous utilisons le $elemMatch est d'être sûr que le champ que nous sommes sur le point de supprimer du tableau n'a pas changé depuis que nous avons interrogé le document pour la première fois. Lorsqu'il est couplé avec un $pull ce n'est pas non plus strictement nécessaire, mais je suis généralement trop prudent dans ces situations. S'il n'y a pas de parallélisme dans votre application et que vous n'avez qu'une seule instance d'application, ce n'est pas strictement nécessaire.

Maintenant, lorsque nous vérifions le document résultant, nous obtenons :

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