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 presenteraw
è 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.