MongoDB Count()与聚合

MongoDB Count()与聚合,mongodb,mongodb-query,nosql-aggregation,Mongodb,Mongodb Query,Nosql Aggregation,我在mongo中经常使用聚合,我知道在分组计数等方面的性能优势。但是,mongo在计算集合中所有文档的这两种方法的性能上有什么不同吗 collection.aggregate([ { $match: {} },{ $group: { _id: null, count: {$sum: 1} } }]); 及 更新:第二种情况: 假设我们有以下样本数据: {_id: 1, type: 'one', value: true} {_id: 2,

我在mongo中经常使用聚合,我知道在分组计数等方面的性能优势。但是,mongo在计算集合中所有文档的这两种方法的性能上有什么不同吗

collection.aggregate([
  {
    $match: {}
  },{
    $group: {
      _id: null, 
      count: {$sum: 1}
    }
}]);

更新:第二种情况: 假设我们有以下样本数据:

{_id: 1, type: 'one', value: true}
{_id: 2, type: 'two', value: false}
{_id: 4, type: 'five', value: false}
使用
aggregate()

使用
count()

var counted={};
变量类型='two';
对于(i=0,len=_id.length;i
.count()
要快得多。您可以通过调用

//注意末尾缺少的括号
db.collection.count
返回光标的长度。默认查询(如果在没有查询文档的情况下调用
count()
),这反过来又被实现为返回
\u id\u
索引iirc的长度

然而,聚合读取每个文档并对其进行处理。如果只对大约100k的文档执行此操作(根据您的RAM进行分配),则与
.count()
相同的数量级只能达到一半

以下功能已应用于包含1200万个条目的集合:

函数检查速度(列,迭代次数){
//收集
var collectionUnderTest=db[col];
//我们正在向其写入统计数据的集合
var stats=db[col+'stats']
//删除旧数据
stats.remove({})
//防止循环中的分配
var start=new Date().getTime()
var duration=new Date().getTime()
打印(“使用count()计数”)

对于(var i=1;我为什么不试试看?@johnyhk尝试过,
collection.aggregate()
似乎快了一点,但不确定,在100K上的测试速度几乎相同。我想看看社区体验。感谢您的回复。您能就我的更新给出您的意见吗(第二种情况)?@itsme没有。首先是因为缺乏基本的礼貌,其次是因为我不支持将MongoDB误用为RDBMS。
{_id: 1, type: 'one', value: true}
{_id: 2, type: 'two', value: false}
{_id: 4, type: 'five', value: false}
var _ids = ['id1', 'id2', 'id3'];
var counted = Collections.mail.aggregate([
  {
    '$match': {
      _id: {
        '$in': _ids
      },
      value: false
    }
  }, {
    '$group': {
      _id: "$type",
      count: {
        '$sum': 1
      }
    }
  }
]);
var counted = {};
var type = 'two';
for (i = 0, len = _ids.length; i < len; i++) {
  counted[_ids[i]] = Collections.mail.find({
    _id: _ids[i], value: false, type: type
  }).count();
}