【问题标题】:expressjs mongodb find query loop with queries insideexpressjs mongodb查找查询循环,里面有查询
【发布时间】:2016-10-13 10:48:08
【问题描述】:

所以我使用这个查询来创建一个数组以传递给 ejs 以生成表行。但在我通过它之前,我还有其他查询,例如引用 id 或计数。但我数不清。我可能还有其他疑问。

router.get('/', function(req, res, next) {
    MongoClient.connect(MongoUrl, function(err, db) {

        var table_data = [];
        db.collection('categories').find().toArray(function(err, result) {

            for (var i = 0, len = result.length; i < len; i++) {
                var count;
                db.collection('articles').count({category_id: result[i].category_id}, function(err, count) {
                    count = count;
                });

                table_data[i] = {
                    "category_id" : result[i].category_id,
                    "category" : result[i].category,
                    "count" : count,
                    "date_last_imported" : result[i].date_last_imported,
                    "feed" : result[i].feed,
                    "url" : result[i].url,
                    "xml" : result[i].xml
                };

            }
            console.log(table_data);
            res.render('categories', {title:"Categories",table_data: table_data});
        });
    });
});

【问题讨论】:

  • 您没有从 db.collection 函数返回任何内容。尝试返回值:return count;
  • var count = db.collection('articles').count({category_id:result[i].category_id}, function(err, count) {return count;});不工作
  • 刚查了一下,你实际上想做这样的事情:var count = db.collection('articles').count({category_id: result[i].category_id});。我从未这样做过,但文档暗示这是最佳做法。
  • 说 Promis 待定
  • 什么意思?你能告诉我完整的错误跟踪吗?

标签: node.js mongodb express ejs


【解决方案1】:

这是因为 count 尚未获取,并且您已将其推送到未定义的数组中。如果您在查询中有很多查询,那么在这种情况下,您将陷入回调地狱。要摆脱这种情况,请使用 Promise 或使用“异步”模块。

供参考:http://caolan.github.io/async/

对于当前场景并了解为什么“计数”未定义:

router.get('/', function(req, res, next) {
    MongoClient.connect(MongoUrl, function(err, db) {

        var table_data = [];
        db.collection('categories').find().toArray(function(err, result) {

            for (var i = 0, len = result.length; i < len; i++) {
                var count;
                db.collection('articles').count({category_id: result[i].category_id}, function(err, count) {
                    count = count;
                table_data.push( {
                    "category_id" : result[i].category_id,
                    "category" : result[i].category,
                    "count" : count,
                    "date_last_imported" : result[i].date_last_imported,
                    "feed" : result[i].feed,
                    "url" : result[i].url,
                    "xml" : result[i].xml
                });
             if(table_data.length === result.length) {
               res.render('categories', {title:"Categories",table_data:  table_data});
             }
                 });



            }

        });
    });
});

更新: 摆脱内部查询。

router.get('/', function(req, res, next) {
    MongoClient.connect(MongoUrl, function(err, db) {
        var table_data = [];
        db.collection('categories').find().toArray(function(err, result) {
          async.each(result, function (user, cb) {
            async.waterfall([
              function (cb) {
                db.collection('articles').count({
                    category_id: result[i].category_id
                }, function(err, count) {
                    cb(err, count);
                });
              },
              function (count, cb) {
                //another query
                cb(err, count, secondquerydata);
              },
              .....
            ], function (err, count, secondquerydata, .....) {
              if(err) return callback(err);
              // here use your all query data
              table_data.push( {
                  "category_id": result[i].category_id,
                  "category": result[i].category,
                  "count": count,
                  "date_last_imported": result[i].date_last_imported,
                  "feed": result[i].feed,
                  "url": result[i].url,
                  "xml": result[i].xml
              });
              res.render('categories', {
                  title: "Categories",
                  table_data: table_data
              });
            })
          })

        });
    });
});

【讨论】:

  • 从异步中如何将其传回并分配给 table_data 数组?
  • table_data 现在获取所有数据。但我不确定 res.render 是否在正确的位置。它不会停止为我加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2021-07-19
  • 2016-08-13
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多