【问题标题】:How to count aggregate query?如何计算聚合查询?
【发布时间】:2015-03-24 05:12:35
【问题描述】:

我正在使用 mongoose/nodejs 应用程序构建分页并具有以下代码:

var Query = Model.find(   
  "location": {
     "$geoWithin": {
        "$box": [
           [165.8694369, -52.61941849999999],
           [175.831536, -29.2313419]
         ]
     }
  }
});

// Get count of documents
return Query.count(function (err, totalCount) {
    if (err) throw err;

    // Get paginated list
    return Query.
          find().
          skip(skip).
          limit(limit).
          exec(function (err, results) {
             if (err) throw err;

             // return result 
          });

在前面的代码中,我得到totalCount 在客户端构建分页,它工作正常。但现在我需要使用 aggregate 而不是 find 并尝试以下操作:

// Construct pipeline
var pipeline = [{
   "$geoNear": {
      "near": [165.8694369, -52.61941849999999],
      "distanceField": "distance"
    }
}];

var Query = adModel.aggregate(pipeline);

// Get count of documents
return Query.count(function (err, totalCount) {
    if (err) throw err;

但不幸的是,我收到了错误 count() method does not exists。如何使用聚合框架计算文档总数?

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    问题在于Model.aggregate doesn't return a Query object 这就是count 方法不存在的原因。

    无论如何,因为它返回一个承诺,你可以像这样计算你的文档:

    adModel.aggregate(pipeline).then(function (docs) {
        console.log(docs.length);
    });
    

    如果你不喜欢 Promise,你仍然可以通过回调:

    adModel.aggregate(pipeline, function (err, docs) {
        console.log(docs.length);
    });
    

    【讨论】:

    • 感谢您的回复,但Model.count() 更有效率是吗?在你的 sn-p 中,我们执行了两次aggregate,它可能效率不高。
    • @Erik 不,它们只是调用它的两种方式。第一个使用承诺第二个使用回调。你不需要同时使用它们,只需要一个,取决于你想使用 Promise 还是 callbacks
    • 如果您想知道针对查询的 total 文档数量,然后仅加载文档的子集以进行分页,这将无济于事。您能否在不运行聚合查询两次的情况下确定总计数(例如在 $limit 阶段之前)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2015-11-19
    • 1970-01-01
    • 2022-11-30
    • 2021-01-20
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多