MongoDB Count()与聚合
我在mongo中经常使用聚合,我知道在分组计数等方面的性能优势。但是,mongo在计算集合中所有文档的这两种方法的性能上有什么不同吗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,
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();
}