执行多个 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose/Node 中同时渲染多个变量?

在多个集合中搜索 mongoose

基于多个子文档的MongoDB/Mongoose查询

(Mongo/Mongoose) 如何处理等待多个查询的结果

在 Mongoose 中查询多个子文档元素

Node.js 和 Mongoose 正则表达式查询多个字段