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

MongoDB actualiza todos los campos de error de matriz

EDITAR

El detalle que faltaba en la pregunta era que el campo requerido para actualizar estaba en realidad en un subdocumento . Esto cambia la respuesta considerablemente:

Esta es una limitación de lo que puede posiblemente hacer con la actualización de los elementos de la matriz. Y esto se explica claramente en la documentación . Principalmente en este párrafo:

Entonces, ésta es la cuestión. Intentando actualizar todos de los elementos de la matriz en una declaración única como esta no trabajar. Para hacer esto, debe hacer lo siguiente.

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

Que es básicamente la forma de actualizar cada elemento de matriz

El multi configuración en .update() significa a través de múltiples "documentos". no puede ser aplicado a múltiples elementos de una matriz. Así que actualmente la mejor opción es reemplazar todo. O, en este caso, también podemos reemplazar el todo documento ya que tenemos que hacerlo de todos modos.

De real datos masivos, utilice db.eval() . Pero por favor, lea primero la documentación:

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

Actualizando todo los elementos de una matriz en el todo la colección no es simple.

Original

Más o menos exactamente lo que dice el error. Para usar un operador posicional, debe coincidir algo primero. Como en:

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

Entonces, ¿dónde está el coincidencia la condición determina la posición de los elementos que son menores que 0 entonces ese índice se pasa al operador posicional.

PD :Cuando muti es verdadero significa que actualiza cada documento. Déjalo false si solo te refieres a uno . Cuál es el predeterminado.