MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como atualizar um valor de matriz no Mongoose


Você não pode usar $set e $push na mesma expressão de atualização que os operadores aninhados.

A sintaxe correta para usar os operadores de atualização é a seguinte:
{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

onde <operator1>, <operator2> pode ser de qualquer uma das listas de operadores de atualização especificadas aqui.

Para adicionar um novo elemento ao array, um único $push operador será suficiente e. você pode usar o findByIdAndUpdate método de atualização para retornar o 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 seu update() original método, a sintaxe é
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);
   }
);

em que a função de retorno de chamada recebe os argumentos (err, raw) Onde
  • err é o erro se algum ocorreu
  • raw é a resposta completa do Mongo

Como você deseja verificar o documento modificado, sugiro que use o findByIdAndUpdate função desde o update() O método não fornecerá o documento modificado, apenas o resultado completo da gravação do mongo.

Se você deseja atualizar um campo no documento e adicionar um elemento a uma matriz ao mesmo tempo, pode fazer
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);
    }
);

O acima irá atualizar o name campo para "foo" e adicione o ID do funcionário ao childrens variedade.