如何计算聚合查询?

时间:2015-03-23 20:15:15

标签: node.js mongodb mongoose aggregation-framework

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

1 个答案:

答案 0 :(得分:2)

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

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

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

如果您不喜欢承诺,您仍然可以通过回调:

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