执行多个 Mongoose 查询
Posted
技术标签:
【中文标题】执行多个 Mongoose 查询【英文标题】:Executing multiple Mongoose queries 【发布时间】:2014-01-09 15:18:31 【问题描述】:我正在使用 node 和 mongoose 对我的 mongodb 运行查询。我有一组 3 个查询,我正在运行如下:
company.find( 'shortName': eval("/" + req.params.query + "/i"), logoFileName : $exists : true , function(err, b)
if(err)
console.log('brand query not found! ' + err);
res.send(500, "Something broke!")
else
console.log("length of b : " + b.length)
if(b.length>1)
res.render('index',
potentialBrands : b
)
else
var brandResults = b[0];
var industryQuery = company.find(GICSIndName: eval("'"+brandResults.GICSIndName+"'")).sort(marketCap: -1).limit(10);
industryQuery.exec(function(err, industry)
if(err)
console.log("There was an error! : " + err)
res.send(500, "Something broke!")
//if the colors have yet to be defined
if(typeof brandResults.associatedColors[0] !== 'undefined')
var colorQuery = company.find('associatedColors.colorFamily': eval("'" + brandResults.associatedColors[0].colorFamily + "'") );
colorQuery.exec(function(err, colors)
if(err)
console.log("There was an error! : " + err)
res.send(500, "Something broke!")
console.log(colors);
res.render('brand',
brandResult : brandResults,
industryResult: industry,
colorResult: colors,
queryName : req.params.query
);
)
else
res.send(500, "Something broke!")
)
我当前的结构似乎效率很低,我想知道 mongo 或 mongoose 中是否有一些东西是为处理此类查询而构建的。
【问题讨论】:
什么是低效的?你可以试试 codereview.stackexchange.com。 我认为他的意思是效率低下,因为他正在查询同一个集合,但必须执行 3 个单独的查询才能这样做。 【参考方案1】:只使用异步
async.waterfall([
function(wcallback)
return wcallback(null, req.params.query);
,
function(query, wcallback)
company.find( 'shortName': eval("/" + req.params.query + "/i"), logoFileName : $exists : true , function(err, b)
if(err || !b || b.length == 0) return wcallback(err || true);
else if(b.length == 1) return wcallback(null, b[0]);
else....
,
function(brandResults, wcallback)
company.find('associatedColors.colorFamily': eval("'" + brandResults.associatedColors[0].colorFamily + "'") , function(err, b)
.....
return wcallback(null, ...);
], function(err, result)
// final callback
if(err) ... else ...
);
【讨论】:
【参考方案2】:出于组织目的(即,使代码更具可读性),有async 和streamline 之类的选项。
但是要解决您关于效率的问题,您可以将其卸载到 mongo,但不幸的是,要能够根据文档中的值进行查询等操作,您必须依赖 mongo aggregation framework 或 map-reduce,这可能是矫枉过正,因为它们并不完全简单。
【讨论】:
【参考方案3】:我建议看看 Promises。
http://mongoosejs.com/docs/api.html#promise_Promise
您的 2 个查询似乎也可以异步运行,您可以使用 Q 一起运行它们:
https://npmjs.org/package/mongoose-q
【讨论】:
以上是关于执行多个 Mongoose 查询的主要内容,如果未能解决你的问题,请参考以下文章