28

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

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

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

但它不断抛出错误。除了排序和获取顶部/底部之外,还有什么好方法?

谢谢!

4

9 回答 9

48

max() 不能按照您在 SQL for 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()
于 2011-01-21T20:25:46.633 回答
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** }
            });
于 2011-11-25T14:00:21.013 回答
9
db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)
于 2013-05-24T18:55:07.990 回答
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"}
    }
  } 
)
于 2013-06-05T22:30:51.413 回答
3

它将根据您的要求工作。

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
于 2015-03-30T11:30:01.417 回答
3

使用聚合():

db.transactions.aggregate([
  {$match: {id: x}},
  {$sort: {sellprice:-1}},
  {$limit: 1},
  {$project: {sellprice: 1}}
]);
于 2013-05-23T20:13:55.020 回答
0

假设我正在使用 Ruby 驱动程序(我在底部看到一个 mongodb-ruby 标记),如果我想获得最大值_id(假设我_id是可排序的),我会执行以下操作。在我的实现中,my_id是一个整数。

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

要获得_id集合中的最小值,只需更改:desc:asc

于 2011-09-20T15:36:58.283 回答
0

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

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

(抱歉,如果我的 Ruby 有点笨拙,我已经很长时间没有使用它了——但一般的方法应该从代码中很清楚。)

于 2011-01-21T20:32:10.717 回答
0

以下查询做同样的事情: db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

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

于 2014-11-03T16:23:46.437 回答