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

MongoDB met à jour tous les champs d'erreur de tableau

MODIFIER

Le détail manquant dans la question était que le champ requis à mettre à jour se trouvait en fait dans un sous-document . Cela change considérablement la réponse :

Il s'agit d'une contrainte de ce que vous pouvez éventuellement faire avec la mise à jour des éléments du tableau. Et ceci est clairement expliqué dans la documentation . Principalement dans ce paragraphe :

Voici donc la chose. Essayer de mettre à jour tous des éléments du tableau dans une seule instruction comme celle-ci ne sera pas travailler. Pour ce faire, vous devez effectuer les opérations suivantes.

db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
    doc.items.forEach(function(item) {
        item.qty = 0;
    });
    db.warehouses.update({ "_id": doc._id }, doc );
})

C'est essentiellement la façon de mettre à jour chaque élément de tableau.

Le multi réglage dans .update() signifie sur plusieurs "documents". Il ne peut pas être appliqué à plusieurs éléments d'un tableau. Donc actuellement la meilleure option est de remplacer le tout. Ou dans ce cas on peut tout aussi bien remplacer l'entier document puisque nous devons le faire de toute façon.

Pour vrai données en masse, utilisez db.eval() . Mais veuillez lire la documentation d'abord :

db.eval(function() {
    db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
        doc.items.forEach(function(item) {
            item.qty = 0;
        });
        db.warehouses.update({ "_id": doc._id }, doc );
    });
})

Mise à jour de tous les éléments d'un tableau dans l'ensemble la collecte n'est pas simple.

Original

À peu près exactement ce que dit l'erreur. Pour utiliser un opérateur positionnel, vous devez faire correspondre quelque chose d'abord. Comme dans :

db.warehouses.update(
    // query 
    {
        _id:ObjectId('5322f07e139cdd7e31178b78'),
        "items.qty": { "$gt": 0 }
    },    
    // update 
    {
        $set:{"items.$.qty":0}
    },    
    // options 
    {
        "multi" : true,  
        "upsert" : true  
    }
);

Alors, où le correspond la condition définit la position des éléments qui sont inférieurs à 0 alors cet index est passé à l'opérateur positionnel.

P.S :Lorsque muti est vrai cela signifie qu'il met à jour chaque document. Laissez-le false si vous ne voulez dire un . C'est la valeur par défaut.