【发布时间】:2014-07-10 04:12:14
【问题描述】:
我有一个像这样的简单元素集合
{_id: n, xs: [...]}
我正在尝试计算所有数组中的元素总数
db.testRace.aggregate([{ $unwind : "$xs" }, { $group : { _id : null, count : { $sum : 1 } } }])
除非我开始对这个集合进行大量更新,否则它会很好用。在繁重的更新操作负载下,我得到了错误的总数 - 比它应该的略大。
它可以很容易地复制。 首先生成一些测试数据
for(var i = 1; i <= 1000000; i++) {
db.testRace.insert({_id: i, xs: [i]});
}
然后模拟很多更新
while(true) {
var id = Math.floor((Math.random() * 1000000) + 1);
var obj = db.testRace.find({_id: id}).next();
obj.some="change";
db.testRace.update({_id: id}, obj);
}
当它运行时,做聚合展开查询。 没有负载我得到正确的结果 - 1000000。但是当有很多更新时,我得到更大的数字,比如 1001456。
如果我像这样运行查询
db.testRace.aggregate([{ $unwind : "$xs" }, {$group: {_id:"$xs", count:{$sum: 1}}}, { $sort : { count : -1 } }, { $limit : 2 }]);
我明白了
"result" : [
{
"_id" : 996972,
"count" : 2
},
{
"_id" : 997789,
"count" : 2
}
],
所以似乎对某些记录进行了两次聚合计数。
这是预期的行为还是我做错了聚合?
我在本地 mongodb 实例上进行了测试,版本 - 2.4.9
【问题讨论】:
标签: mongodb aggregation-framework