如何统计聚合查询?

How to count aggregate query?

我正在使用 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。我怎么能用聚合框架计算文档总数?

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

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

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

如果您不喜欢 promise,您仍然可以传递回调:

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