在mongodb forEach循环查询之后,在SailsJS中渲染视图

时间:2013-12-16 02:10:47

标签: node.js mongodb sails.js node-mongodb-native

我有2个集合名称“Keywords”和“Company”,我使用MongoDB聚合框架从“关键字”集合中检索相关的object._id,基于关键字用户键。

从关键字集合中获取object._id之后,我想使用object._id查询并编译公司集合中的最终完整文档。

我坚持使用res.view()在结果[]收集公司集合中的所有文档之前先运行的部分。

我需要帮助将我的代码转换为同步方法。请帮我。以下是我的所作所为。

“关键字”集合

中的文档示例
{
"_id": ObjectID("52ac7130bd40d00a7beb7a29"),
"keyword": "Sunshine",
"object": [
    {
        "_id": ObjectID("528443ce751fc9b805d640ad"),
        "type": "companyName"
  }
]
}

“公司”集合中的文档样本

{
"_id": ObjectID("528443ce751fc9b805d640ad"),
"name": "Sunshine Plaza",
...
...
...
}

SailsJS中的SearchController

var keyWords = req.query.q,
    searchKeywords = keyWords.toLowerCase().replace(/[^\w\s]/gi, ' ').split(' '), //For example user key in "Sunshine Plaza"
    results = [];

    Keyword.native(function(err,collection){
        collection.aggregate([
            {
                $project : {
                    '_id' : 0,
                    'keyword' : 1,
                    'object' : 1
                }
            }, {
                $match : {
                    'keyword' : {
                        '$in' : searchKeywords
                    }
                }
            } , {
                $unwind : '$object'
            } , {
                $group : {
                    _id : '$object._id',
                    count : {
                        $sum : 1
                    }
                }
            } , {
                $sort : {
                    count: -1
                }
            } , {
                 $skip : 0
            } , {
                $limit : 10
            }
        ], function (err, docs){
            docs.forEach(function (doc, i){
                Company.findOne({
                    '_id' : doc._id
                },function(err,docs){
                    results.push(docs);
               });
            });
        });
    });

    res.view({
        key : keyWords,
        results : results,
        layout: "layouts/search"
    });

1 个答案:

答案 0 :(得分:1)

您缺少的是这不是阻止代码。

以下

setTimeout(function() {
    console.log('hi');
}, 2000);

console.log('bob');
首先会发生{p> Bob。然后是hi。这是因为它不会停止。

所以你应该重写这部分代码:

function (err, docs){
            docs.forEach(function (doc, i){
                Company.findOne({
                    '_id' : doc._id
                },function(err,docs){
                    results.push(docs);
               });
            });
        });
    });

    res.view({
        key : keyWords,
        results : results,
        layout: "layouts/search"
    });

如下所示:

function (err, docs){
        docs.forEach(function (doc, i){
            Company.findOne({
                '_id' : doc._id
            },function(err,docs){
                results.push(docs);   
           });
        }, myFunction());
    });
});
function myFunction() {
    res.view({key : keywords, results : results, layout: "layouts/search" });
}