【问题标题】:How do you push MongoDB objects into a global array without it overwriting?如何将 MongoDB 对象推送到全局数组而不覆盖它?
【发布时间】:2021-05-05 07:07:19
【问题描述】:

我遇到了范围界定问题。首先,我正在搜索当前用户,一旦找到他或她的对象,我就会访问他们的朋友数组。在该朋友数组中,存储了每个朋友的用户名。然后,我尝试在该好友数组上执行 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)
        }
    })
    
}

【问题讨论】:

  • 数组中的数据没有消失。当它到达res.json(friendsObjArr) 时,它从未真正进入过那里。为什么?仅仅是因为 User.findOne 在您的 forEach 中的异步调用中需要这样处理。您将需要利用 Promise 来完成这项工作。你用的是猫鼬还是原生的nodejs驱动?

标签: node.js arrays mongodb scope mongodb-query


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2020-05-21
    • 2022-01-20
    • 1970-01-01
    • 2016-03-05
    • 2018-12-13
    • 2023-01-18
    • 2017-05-30
    相关资源
    最近更新 更多