我正在尝试在我的文档中找到一个特定的ID,然后将一个数组合并到现有的数组中,例如,如果我将这个数组存储在db.friends中:
["12","13","14"]
我发送这个数组:["12","16","18"]
,db.friends应该包含:["12","13","14","16","18"]
我正在使用下划线库,但我不确定是否必须(可能在mongoose中“聚合”?)
这是我做的,你能告诉我我错在哪里吗?
function saveFollowers(req, res) {
var friends = req.body.friends; // the new array to merge ["54aafe9df4ee360300fc94c7"];
User.findOne({_id: req.user._id}).exec(function (err, user) {
if (err) {
res.jsonp({error: "Error fetching user info"})
} else {
friends = _.extend(friends, user.friends); //user.friends=existing friends we have in db
user.save(function (err) {
if (err) { res.jsonp({error: "Cant save"}); }
console.log("Friends NOW:"+JSON.stringify(friends)); //Here I don't see the merge, also, I can't see it in mongo db.
res.jsonp("success");
});
}
});
谢谢!
答案 0 :(得分:0)
使用当前的实现,您实际上没有修改返回的用户对象中的friends键。因此,您可以使用 union
方法作为
user.friends = _.union(friends, user.friends); //user.friends=existing friends
user.save(function (err) { .. }
或者使用ES6使用spread operator连接数组,使用Set创建一组不同的元素:
user.friends = [...new Set([...friends ,...user.friends])];
user.save(function (err) { .. }
另一种方法是使用聚合框架,您可以使用 $setUnion
运算符:
function saveFollowers(req, res) {
var friends = req.body.friends; // the new array to merge ["54aafe9df4ee360300fc94c7"];
User.aggregate([
{ "$match": { _id: req.user._id } },
{
"$project": {
"friends": { "$setUnion": [ "$friends", friends ] }
}
}
]).exec(function (err, results){
if (err) {
res.jsonp({error: "Error fetching user info"})
} else {
User.findByIdAndUpdate(req.user._id,
{ "$set": { "friends": results[0].friends } },
{ "new": true },
function (err, user) {
if (err) { res.jsonp({error: "Cant save"}); }
console.log("Friends NOW: "+ JSON.stringify(user.friends));
res.jsonp("success");
}
);
}
});
}