2017-01-06 2 views
5

Я хочу обновить значение массива, но я не уверен в правильном методе его выполнения, поэтому для того, чтобы пробовал следующий метод, но не работал для меня.Как обновить значение массива в Mongoose

Моя модель, поле дети в моей модели

childrens: { 
     type: Array, 
     default: '' 
    } 

мой запрос,

Employeehierarchy.update({ _id: employeeparent._id} ,{ $set: {"$push": { "childrens": employee._id }} }) 
    .exec(function (err, managerparent) {}); 

Может кто-нибудь пожалуйста, предоставьте мне help.Thanks.

ответ

10

Вы не можете использовать как $set и $push в том же выражении обновления как вложенные операторы.

Правильный синтаксис для использования update operators следующим образом:

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

где <operator1>, <operator2> может быть любой из списка операторов обновления, указанные here.

Для добавления нового элемента в массив достаточно одного оператора $push. Вы можете использовать метод findByIdAndUpdate обновления, чтобы вернуть измененный документ как

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

Использование оригинального update() метод, синтаксис

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

, в котором функция обратного вызова принимает аргументы (err, raw) где

  • err это ошибка если произошел
  • raw является полным ответом Монго

Так как вы хотите, чтобы проверить измененный документ, я предлагаю вам использовать функцию findByIdAndUpdate поскольку метод update() не даст вам измененный документ, просто полный результат записи от монго.


Если вы хотите, чтобы обновить поле в документе и добавить элемент в массив, в то же время, то вы можете сделать

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

выше обновит name поле для «Foo» и добавьте идентификатор сотрудника в массив childrens.

+0

Если я проверить менеджер печати console.log (managerparent + «кк») я получаю сообщение об ошибке, как uncaughtException: managerparent не определен – MMR

+0

Thsnks chridam это wrkd. – MMR

+0

все еще у меня есть еще один вопрос для вас :), если вы в порядке. – MMR

2

может следовать этому

если childrens содержит строковые значения, то модель может быть как:

childrens: [{ 
    type : String 
}] 

если childrens содержит ObjectId значения другой коллекции _id и хочет заселить то модель может быть как:

childrens: [{ 
    type : mongoose.Schema.Types.ObjectId, 
    ref: 'refModelName' 
}] 

не нужно использовать $set просто используйте $push, чтобы вставить значение в массив childrens. поэтому запрос может быть как:

Employeehierarchy.update(
    { _id: employeeparent._id}, 
    {"$push": { "childrens": employee._id } } 
).exec(function (err, managerparent) { 
    // 
}); 
+0

Модель I объявлена ​​так, что она может стать массивом объектов? Который я не хочу – MMR

+0

не массив объекта будет массивом, который будет содержать идентификаторы (как строка для первого процесса и для второго процесса как ObjectId). @nlr_p –

+0

Ok Thaks Shaishab Roy. – MMR