我有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"
});
答案 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" });
}