如何将 MongoDB 对象推送到全局数组而不覆盖它?

问题描述 投票:0回答:1

我遇到了范围界定问题。首先,我正在搜索当前用户,一旦找到他或她的对象,我就访问他们的朋友数组。在该朋友数组中,存储了每个朋友的用户名。然后,我尝试在该朋友数组上执行 forEach 循环,并尝试将每个找到的朋友对象添加到名为 FriendsObjArr 的数组中。当我与一位朋友一起测试它以及最后一个 else 语句中的 res.json 语句时,它起作用了。然而我需要它在循环之外,所以每个朋友都会被推动。问题是,循环结束后,数组中的数据也消失了。这是我的代码:

function getFriends(req, res){
    const username = req.params.userId
    let friendsObjArr = []
    User.findOne({username: username}, (err, foundUser) => {
        if (err){
            console.log(err);
        }
        else {
            foundUser.friends.forEach(friend => {
                User.findOne({username: friend}, (err, foundFriend) =>{
                    if (err){
                        console.log(err);
                    }
                    else{
                        console.log(foundFriend);
                        friendsObjArr.push(foundFriend)   
                    }
                })
            });
            res.json(friendsObjArr)
        }
    })
    
}
node.js arrays mongodb scope mongodb-query
1个回答
1
投票

我建议您利用 MongoDB 的聚合管道来帮助您查找和分组用户,而不是自己进行循环。每次迭代对象和查询数据库时,您的 js 代码可能会出现性能问题。

db.users.aggregate([
  {
    $match: {
      "userId": "Charlie"
    }
  },
  {
    "$unwind": "$friends"
  },
  {
    "$lookup": {
      "from": "users",
      "localField": "friends",
      "foreignField": "username",
      "as": "foundFriend"
    }
  },
  {
    "$unwind": "$foundFriend"
  },
  {
    $group: {
      _id: null,
      friendsObjArr: {
        "$addToSet": "$foundFriend"
      }
    }
  }
])

这里有一个 MongoDB Playground 供您参考。

© www.soinside.com 2019 - 2024. All rights reserved.