我想通过更新数字字段和数组来合并我的集合。
这是我的架构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",... ]
等。
我不知道该怎么做。
答案 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.vote
与like.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); }
});