【问题标题】:MongoDB Collation loopMongoDB 排序规则循环
【发布时间】:2015-09-21 01:19:26
【问题描述】:

我正在尝试在另一个查找中运行查找,但我没有从第二次查找操作中获得任何结果。

User.find({}, function (err, docs) {
    for (i = 0; i < docs.length; i++) {
        var tmp = '';

        UserGroups.find({userName: docs[i].userName}, function (errin, groups) {
            for (g = 0; g < groups.length; g++) {
                tmp += ", " + groups[g].groupName;
                //console.log(groups[g].groupName);
            }
        });

        console.log(tmp);

        //docs[i].group = that;
        docs[i].username = decrypt(docs[i].username);
        docs[i].password = '';

    }
    res.render('users', {users: docs});
});

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

    您的UserGroups.find 将异步运行,因此console.log(tmp) 将在您的UserGroups.find 有机会完成之前运行,并且您的电话将在您获得任何结果之前返回。如果您想要UserGroup.find 的结果,您需要将所有逻辑移动到该回调中。

    编辑

    在可预测性和查询性能方面,我认为这是一种更好的方法。您之前的方法 UserGroup.find 被调用 n 次。 N 是数据库中的用户数。这种方法只查询数据库两次。一次获取所有用户,第二次获取所有组。

    User.find({}, function (err, docs) {
    
        //Get all the usernames before executing the UserGroups query
        var userNames = [];
        users.forEach(function(element) {
            userNames.push(element.userName);
        });
    
        UserGroups.find({userName: {$in : userNames}}, function (errin, groups) {
            for (var i = 0; i < docs.length; i++) {
                //get all the groups that belong to this user
                var userGroups = groups.filter(function(value) {
                    return value.userName === docs[i].userName;
                });
    
                var tmp = "";
                userGroups.forEach(function(element){
                    tmp += "," + element.groupName
                });
    
                //docs[i].group = that;
                docs[i].username = decrypt(user[i].username);
                docs[i].password = '';
            }
            res.render('users', {users: docs});
        });
    });
    

    此外,由于您使用的是 Mongoose,您可以使用 Mongoose 中内置的 populate 功能将集合“加入”在一起

    【讨论】:

    • 用于填充?你读过文档吗?我怀疑它,因为我在 15 秒前发布了它。如果您遇到困难,请先尝试使其正常工作。
    • 在 UserGroups.find() 之后执行的代码现在位于 UserGroups.find() 回调中。注意 console.log 和 docs[i] 代码现在在我的答案中的位置
    • 哦,好吧,我想我明白了……我明天在电脑上检查一下。谢谢大佬
    • 我的回答仍然存在问题,但是您可能无法获得查询中的最后一个用户组,因为在最后一个 UserGroups.find() 回调之前完成第一个 for 循环的问题可以是评估。如果您可以控制模型,您最好的选择是考虑使用 Mongoose 填充。否则你的代码需要一些返工来防止我提到的问题
    猜你喜欢
    • 2020-09-22
    • 2018-03-10
    • 2017-05-17
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多