如何将MongoDB对象推送到全局数组中而不使用它?

92dk7w1h  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(103)

我有一个scoping问题。首先,我搜索当前用户,一旦找到他或她的对象,我就访问他们的朋友数组。在这个friends数组中,存储了每个朋友的用户名。然后,我尝试在该friends数组上执行forEach循环,并尝试将每个找到的friend对象添加到名为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)
        }
    })
    
}
rqdpfwrv

rqdpfwrv1#

我建议你利用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供您参考。

相关问题