我有一个MongoDB集合,需要在所有文档中找到某个字段的max()值。此值是时间戳,我需要通过查找最大时间戳来查找最新的文档。对它进行排序并获得第一个效率非常快。我应该单独维护一个'maxval',并在每次doc到达该字段的值更大时更新它吗?有更好的建议吗? 非常感谢。
答案 0 :(得分:18)
如果你在timestsamp字段上有一个索引,找到最高值就像
一样有效db.things.find().sort({ts:-1}).limit(1)
但如果索引过多,将max存储在单独的集合中可能会很好。
答案 1 :(得分:3)
确定它是否是大集合,如果您需要始终显示最大时间戳,您可能需要在那里创建单独的收集和存储统计数据,而不是每次都订购大集合。
statistic
{
_id = 1,
id_from_time_stamp_collection = 'xxx',
max_timestamp: value
}
每当新文档出现时,只更新id = 1的统计信息收集(查询中使用$ gt条件,因此如果新时间戳将大于max_timestamp,则更新max_timestamp,否则 - 否)。
您也可以在统计信息收集中存储和更新其他统计数据。
答案 2 :(得分:-3)
尝试使用db.collection.group
例如,使用此集合:
> db.foo.find()
{ "_id" : ObjectId("..."), "a" : 1 }
{ "_id" : ObjectId("..."), "a" : 200 }
{ "_id" : ObjectId("..."), "a" : 230 }
{ "_id" : ObjectId("..."), "a" : -2230 }
{ "_id" : ObjectId("..."), "a" : 5230 }
{ "_id" : ObjectId("..."), "a" : 530 }
{ "_id" : ObjectId("..."), "a" : 1530 }
您可以使用
使用group
> db.foo.group({
initial: { },
reduce: function(doc, acc) {
if(acc.hasOwnProperty('max')) {
if(acc.max < doc.a)
acc.max = doc.a;
} else {
acc.max = doc.a
}
}
})
[ { "max" : 5230 } ]
由于key
中没有group
值,所有对象都会在一个结果中分组