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

Cómo actualizar un valor de matriz en Mongoose

No puedes usar ambos $set y $push en la misma expresión de actualización que los operadores anidados.

La sintaxis correcta para usar los operadores de actualización es la siguiente:

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

donde <operator1>, <operator2> puede ser de cualquiera de la lista de operadores de actualización especificada aquí.

Para agregar un nuevo elemento a la matriz, un solo $push operador será suficiente, p. puede usar findByIdAndUpdate método de actualización para devolver el documento modificado como

Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { "$push": { "childrens": employee._id } },
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);

Usando su update() original método, la sintaxis es

Employeehierarchy.update(
   { "_id": employeeparent._id},
   { "$push": { "childrens": employee._id } },
   function (err, raw) {
       if (err) return handleError(err);
       console.log('The raw response from Mongo was ', raw);
   }
);

en el que la función de devolución de llamada recibe los argumentos (err, raw) donde

  • err es el error si ocurrió alguno
  • raw es la respuesta completa de Mongo

Como desea verificar el documento modificado, le sugiero que use el findByIdAndUpdate función desde el update() El método no le dará el documento modificado, solo el resultado de escritura completo de mongo.

Si desea actualizar un campo en el documento y agregar un elemento a una matriz al mismo tiempo, puede hacerlo

Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { 
        "$set": { "name": "foo" },
        "$push": { "childrens": employee._id } 
    } 
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);

Lo anterior actualizará el name campo a "foo" y agregue la identificación del empleado a los childrens matriz.