5

我正在使用mongodb作为节点,并试图根据一些设置的过滤器来聚合文档的集合,然后将其限制为10个。我把它聚合得很好,限制得很好,但我需要在将它们限制为10之前获得该汇总文档的总数。MongoDB节点驱动程序当前聚合的计数

这是我的代码。

var qry = []; 
if (filter.FocusArea && filter.FocusArea != "(None)") { 
    qry.push({ 
     $match: { 'ProgramAreaId': filter.FocusArea } 
    }); 
} 
if (filter.Status && filter.Status != "(None)") { 
    qry.push({ 
     $match: { 'StatusId': filter.Status } 
    }); 
} 
if (filter.ProgOfficer && filter.ProgOfficer != "(None)") { 
    qry.push({ 
     $match: { 'ProgramOfficerId': filter.ProgOfficer } 
    }); 
} 
if (filter.Fund && filter.Fund != "(None)") { 
    qry.push({ 
     $match: { 'FundId': filter.Fund } 
    }); 
} 
var skipNbr = (parseInt(filter.Page) * 10 - 10); 
qry.push({ $project: { _id: '$_id', count: { $sum: '$$ROOT' }, content: '$$ROOT'} }) // I would like to do the count here. 
qry.push({ $skip: skipNbr }) 
qry.push({ $limit: 10 }) 
var apps = mongo.collection('Applications').aggregate(qry, function(err, docs) { 
    callback(docs); 
}); 

这可以在一个聚合查询中完成,还是需要分成两个?

回答

2

可以在单个查询中这样做。

您可以使用$project将已过滤的数组投影到两个不同的字段中:一个包含内容,另一个包含计数。可以使用$slice来限制内容数组。

db.collection.aggregate([ 
    { 
     $match: {} // Filter 
    }, 
    { 
     $group: { 
      _id: 1, 
      array: {$push: '$$ROOT'} 
     } 
    }, 
    { 
     $project: { 
      content: { 
       $slice: ['$array', skip, limit] 
      }, 
      total: { 
       $size: '$array' 
      } 
     } 
    } 
], {allowDiskUse: true}) 
+0

$ array是一个mongo属性还是你说的东西在这个地方? – Ohjay44

+0

这是来自您的收藏的项目数组。查看更新后的答案。 –

+0

我想你可能误解了这个问题。我试图在汇总后但在限制之前对我的收藏中的所有文档进行计数。我没有处理文档中的嵌套数组。 – Ohjay44