Mongo没有max()函数,我该如何解决这个问题呢?

时间:2011-06-12 08:50:58

标签: mongodb

我有一个MongoDB集合,需要在所有文档中找到某个字段的max()值。此值是时间戳,我需要通过查找最大时间戳来查找最新的文档。对它进行排序并获得第一个效率非常快。我应该单独维护一个'maxval',并在每次doc到达该字段的值更大时更新它吗?有更好的建议吗? 非常感谢。

3 个答案:

答案 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值,所有对象都会在一个结果中分组