合并lodash数组nodejs mongodb

时间:2015-05-14 19:16:26

标签: arrays node.js mongodb merge lodash

我想通过更新数字字段和数组来合并我的集合。

这是我的架构mongodb:

{
   url: String,
   email: [String],     
   vote: Number
}

node.js代码:

like = _.merge(like, req.body);
like.save(function (err) {
    if (err) { return handleError(res, err); }
});

此代码通过递增值来更新投票字段,但替换现有的电子邮件,而我想将电子邮件推送到数组中。

我想增加投票价值,并将电子邮件推送到数组中,例如["a@gmail.com", "b@gmail.com",... ]等。

我不知道该怎么做。

3 个答案:

答案 0 :(得分:2)

使用_.assign()代替其工作方式,对于源中的每个属性,它将其值按原样复制到目标。如果属性值本身是对象,则不会对其属性进行递归遍历。整个对象将从源中获取并设置到目标。以下示例演示了_.assign()_.merge()之间的差异:

var dest = {
  p: { x: 10, y: 20},
};

var src = {
  p: { x: 20, z: 30},
};

console.log(_.merge(dest, src));

<强>输出

[object Object] {
  p: [object Object] {
    x: 20,
    y: 20,
    z: 30
  }
}

console.log(_.assign(dest, src));

<强>输出

[object Object] {
  p: [object Object] {
    x: 20,
    z: 30
  }
}

所以你的最终代码应该是这样的:

like = _.assign(like, req.body);
like.save(function (err) {
    if (err) { return handleError(res, err); }
});

答案 1 :(得分:0)

使用mongoose文档,您可以像在javascript中的任何其他对象一样修改文档。您的投票最有可能不会增加,因为req.body.votelike.vote的价值相同,在知道传入数据时无法确定。但是,以下解决方案将增加投票和_.merge email属性。

// for just modifing the email property
like.email = _.merge(like.email, req.body.email);
// increment the vote like you would with any number in JavaScript
like.vote++;
like.save(function(err) {
   if (err) retuurn handleError(res, err);
   // handle successfull save
 });

答案 2 :(得分:0)

我将@Nindaff的解决方案与推送方法相结合,这个解决方案对我有用:

like.vote = (like.vote, req.body.vote);
like.email.push(req.body.email);
like.save(function (err) {
    if (err) { return handleError(res, err); }
});