MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come aggiornare un valore di matrice in Mongoose

Non puoi utilizzare entrambi $set e $push nella stessa espressione di aggiornamento degli operatori nidificati.

Segue la sintassi corretta per l'utilizzo degli operatori di aggiornamento:

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

dove <operator1>, <operator2> può provenire da qualsiasi elenco di operatori di aggiornamento specificato qui.

Per aggiungere un nuovo elemento all'array, un singolo $push operatore sarà sufficiente ad es. puoi utilizzare il findByIdAndUpdate update per restituire il documento modificato come

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

Utilizzando il tuo update() originale metodo, la sintassi è

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

in cui la funzione di callback riceve gli argomenti (err, raw) dove

  • err è l'errore, se presente
  • raw è la risposta completa di Mongo

Dato che vuoi controllare il documento modificato, ti suggerisco di utilizzare il findByIdAndUpdate funzione dal update() il metodo non ti darà il documento modificato, solo il risultato di scrittura completo da mongo.

Se vuoi aggiornare un campo nel documento e allo stesso tempo aggiungere un elemento a un array, puoi farlo

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

Quanto sopra aggiornerà il name campo su "pippo" e aggiungi l'ID dipendente a childrens matrice.