【问题标题】:MongoDB: how can I find and merge arrayMongoDB:如何查找和合并数组
【发布时间】:2016-12-06 17:16:53
【问题描述】:

我试图在我的文档中找到一个特定的 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");
        });
        }
    });

谢谢!

【问题讨论】:

    标签: arrays node.js mongodb mongoose underscore.js


    【解决方案1】:

    在您当前的实现中,您实际上并没有修改返回的用户对象中的朋友键。因此,您可以使用 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");
                    }
                );
            }
        });
    }
    

    【讨论】:

    • 谢谢你,chridam,你成就了我的一天! (我使用了你的第二个功能,它只是工作).. :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-01-08
    • 2019-03-16
    • 2018-03-14
    • 1970-01-01
    • 2019-01-17
    • 2021-05-04
    相关资源
    最近更新 更多