【问题标题】:Getting the highest value of a column in MongoDB获取 MongoDB 中列的最高值
【发布时间】:2011-06-13 09:00:06
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 你应该包括它抛出的错误。

标签: ruby mongodb mongodb-ruby


【解决方案1】:

它将根据您的要求工作。

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

【讨论】:

  • 这个答案有什么意义?重复接受的答案?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    db.collectionName.aggregate(
      {
        $group : 
        {
          _id  : "",
          last : 
          {
            $max : "$sellprice"
          }
        }
      }
    )
    

    【讨论】:

      【解决方案4】:

      用于计算聚合的示例 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"}
          }
        } 
      )
      

      【讨论】:

        【解决方案5】:

        使用聚合():

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

        【讨论】:

          【解决方案6】:

          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()
          

          【讨论】:

            【解决方案7】:

            排序可能有点过头了。你可以只做一个组

            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** }
                        });
            

            【讨论】:

            • 考虑到this quote from the manual,我不会说这是矫枉过正 "当 $sort 紧接在管道中的 $limit 之前,$sort 操作只会在进行时保持前 n 个结果, 其中 n 是指定的限制”
            【解决方案8】:

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

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

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

            【讨论】:

            • 难道 find_one() 不会比使用 limit() 更好吗? result = my_collection.find_one({}, :sort =&gt; ['_id', :desc])
            【解决方案9】:

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

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

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

            【讨论】:

            • 考虑使用 MapReduce 进行迭代!!!这就是为什么 MongoDB 很酷,否则使用平面文件 ;-)
            猜你喜欢
            • 2014-03-06
            • 2015-09-06
            • 2010-10-28
            • 2023-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多