Node.js 基于上一次查询的信息查询mongo文档

Node.js 基于上一次查询的信息查询mongo文档,node.js,mongodb,Node.js,Mongodb,我有一个带有应用程序集合和用户集合的mongodb。用户集合中的文档包含可用于在应用程序集合中查找应用程序的应用程序ID 这是用户文档的一个示例: { "_id" : ObjectId("526a8c30f96538307eafe424"), "FirstName" : "test first", "LastName" : "test last", "Email" : "test@test.com", "PasswordHash" : "test",

我有一个带有应用程序集合和用户集合的mongodb。用户集合中的文档包含可用于在应用程序集合中查找应用程序的应用程序ID

这是用户文档的一个示例:

{
    "_id" : ObjectId("526a8c30f96538307eafe424"),
    "FirstName" : "test first",
    "LastName" : "test last",
    "Email" : "test@test.com",
    "PasswordHash" : "test",
    "ApplicationIds" : [ 
        "175672351", 
        "439632472"
    ]
}
{
    "_id" : ObjectId("526a8c66f96538307eafe426"),
    "Id" : "175672351",
    "Name" : "test application",
    "CollectionName" : "test collection name"
}
这是应用程序文档的一个示例:

{
    "_id" : ObjectId("526a8c30f96538307eafe424"),
    "FirstName" : "test first",
    "LastName" : "test last",
    "Email" : "test@test.com",
    "PasswordHash" : "test",
    "ApplicationIds" : [ 
        "175672351", 
        "439632472"
    ]
}
{
    "_id" : ObjectId("526a8c66f96538307eafe426"),
    "Id" : "175672351",
    "Name" : "test application",
    "CollectionName" : "test collection name"
}
我使用nodejs查询数据库,以便显示所有用户应用程序。到目前为止,我能够获取用户集合,并且可以从中获取应用程序ID。但我遇到的问题是,我需要从应用程序集合中获取application名称和collectionName。我尝试使用for循环查找每个应用程序ID。下面是我的代码目前的样子:

var mongo = require('mongodb').MongoClient;
var connectionString = "mongodb://localhost:27017/sandstorm";
var users;
var applications;
var db = mongo.connect(connectionString, function(err, db) {
        if(err)
                throw err;
        console.log("connected to database");
        users = db.collection("users");
        applications = db.collection("applications");
});

exports.getUserApplications = function(req, res) {
        var email = req.params.email;
        var pass = req.params.pass;
        var appObject = {
                "Status": 0,
                "DataObject": {
                        "Applications":[]
                },
                "UserFriendlyErrorMessage": "",
                "DeveloperErrorMessage":""
        };
        var appDetail = {
                "Id": "",
                "Name": "",
                "CollectionName": ""
        };

        // set response header
        res.writeHead(200, {"Content-Type": "application/json"});

        users.findOne({"Email": email, "PasswordHash": pass}, function(err, doc) {
                if(err)
                        throw err;
                if(doc) {
                        // get application ids from the user data
                        var appString = doc.ApplicationIds;
                        var apps = [];
                        for(var i = 0; i < appString.length; i++) {
                                applications.findOne({"Id": appString[i]}, function(err, appDoc) {
                                        appObject["DataObject"]["Applications"] = appDoc;
                                });

                        }
                        res.end(JSON.stringify(appObject, 0, 4));
                } else {
                        appObject["Status"] = 1;
                        appObject["DataObject"] = null;
                        appObject["UserFriendlyErrorMessage"] = "Login Credentials Incorrect";
                        appObject["DeveloperErrorMessage"] = "ERROR: Incorrect Email or Password";
                        res.end(JSON.stringify(appObject, 0, 4));
                }
        });
};

我只需要与用户关联的应用程序。

您可以使用类似的库来解决在循环中从MongoDB检索多个文档的问题,但如果我可以建议一种替代方法:使用一个查询检索所有应用程序文档:

applications.find({ Id : { $in : appString } }).toArray(function(err, appDocs) {
  // TODO: check for `err`
  appObject["DataObject"]["Applications"] = appDocs;
  res.end(JSON.stringify(appObject, 0, 4));
  // or `res.json(appObject)` if you're using Express
});

我尝试了$in,它返回以下内容:{toArray:[Function],each:[Function],next:[Function],nextObject:[Function],setReadPreference:[Function],batchSize:[Function],count:[Function],stream:[Function],close:[Function],explain:[Function],isClosed:[Function],rewind:[Function],limit:[Function],skip:[Function],提示:[Function],maxTimeMS:[Function],排序:[Function],字段:[Function]}这是在使用console.logappDoc;@user-oops,等等,我会编辑我的答案。你需要调用toArray将所有结果读取到一个适当的数组中。谢谢,这很有意义。它现在可以工作了。另外,我可以去掉_-id吗?我知道有类似于_-id=false的东西,但我认为这是用于猫鼬的。我发现,不要介意最后一部分关于删除_-id的内容如何做到这一点,我在{id:{$in:appString}之后添加了{u id:0}。谢谢你的帮助