获取MongoDB中列的最高值

时间:2011-01-21 19:32:13

标签: ruby mongodb mongodb-ruby

我一直在帮助获取mongo文档列的最高值。我可以对它进行排序并获得顶部/底部,但我很确定有更好的方法可以做到这一点。

我尝试了以下(和不同的组合):

transactions.find("id" => x).max({"sellprice" => 0})

但它一直在抛出错误。除了排序和获得顶部/底部之外,有什么好的方法呢?

谢谢!

9 个答案:

答案 0 :(得分:48)

max()无法按照您在SQL中为Mongo所期望的方式工作。这可能会在将来的版本中发生变化,但截至目前,max,min将与索引键一起使用,主要在内部进行分片。

请参阅http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

不幸的是,现在获得最大值的唯一方法是对该值进行排序集合desc并取第一个。

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()

答案 1 :(得分:19)

排序可能有点过分。您可以通过

进行分组
db.messages.group(
           {key: { created_at:true },
            cond: { active:1 },
            reduce: function(obj,prev) { if(prev.cmax<obj.created_at) prev.cmax = obj.created_at; },
            initial: { cmax: **any one value** }
            });

答案 2 :(得分:8)

db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)

答案 3 :(得分:5)

用于计算聚合的mongodb shell代码示例。

请参阅组的mongodb手册条目(许多应用程序):: http://docs.mongodb.org/manual/reference/aggregation/group/#stage._S_group

在下面,将$ vars替换为您的集合键和目标变量。

db.activity.aggregate( 
  { $group : {
      _id:"$your_collection_key", 
      min: {$min : "$your_target_variable"}, 
      max: {$max : "$your_target_variable"}
    }
  } 
)

答案 4 :(得分:3)

使用aggregate():

db.transactions.aggregate([
  {$match: {id: x}},
  {$sort: {sellprice:-1}},
  {$limit: 1},
  {$project: {sellprice: 1}}
]);

答案 5 :(得分:3)

它将按照您的要求工作。

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()

答案 6 :(得分:0)

如果列被索引,那么排序应该没问题,假设Mongo只使用索引来获取有序集合。否则,迭代集合会更有效,记录下看到的最大值。 e.g。

max = nil
coll.find("id" => x).each do |doc| 
    if max == nil or doc['sellprice'] > max then
        max = doc['sellprice'] 
    end
end

(道歉,如果我的Ruby有点松懈,我很长时间没有使用它 - 但是从代码中可以清楚地看到一般的方法。)

答案 7 :(得分:0)

假设我使用的是Ruby驱动程序(我在底部看到了mongodb-ruby标记),如果我想得到最大值_id,我会做类似以下的事情(假设我的_id是可排序的)。在我的实现中,我的_id是一个整数。

result = my_collection.find({}, :sort => ['_id', :desc]).limit(1)

要获得集合中的最低_id,只需将:desc更改为:asc

答案 8 :(得分:0)

以下查询执行相同的操作:     db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

对我来说,这产生了以下结果: { "_id" : NumberLong(10934) }