如何在Mongoose中更新数组值

时间:2017-01-06 08:44:53

标签: node.js mongodb express mongoose mean-stack

我想更新一个数组值,但我不确定正确的方法,所以我尝试了下面的方法,但对我没有用。

我的模特,     我的模型中的儿童字段

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

我的查询,

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

任何人都可以请我帮忙。谢谢。

3 个答案:

答案 0 :(得分:17)

您不能在与嵌套运算符相同的更新表达式中同时使用 $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是Mongo的完整回复

由于您要查看已修改的文档,我建议您使用 findByIdAndUpdate 函数,因为 update() 方法不会给你修改过的文件,只是mongo的完整写入结果。

如果要更新文档中的字段并同时向数组添加元素,则可以执行

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”,并将员工ID添加到childrens数组中。

答案 1 :(得分:2)

可以遵循此

如果childrens包含字符串值,那么模型可以是:

childrens: [{
    type : String
}]

如果childrens包含另一个集合_id的ObjectId值,并且想要填充,那么模型可以是:

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

无需使用$set只需使用$pushchildrens数组中插入值即可。所以查询可以像:

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

答案 2 :(得分:0)

这会帮助我猜

Employeehierarchy.findOneAndUpdate(
  { _id:employeeparent._id },
  { $set: { "childrens": employee._id }}
)