Получение наибольшего значения столбца в MongoDB - PullRequest
28 голосов
/ 21 января 2011

Я помогал получить максимальное значение в столбце для монго-документа.Я могу отсортировать это и получить верх / низ, но я почти уверен, что есть лучший способ сделать это.

Я попробовал следующее (и различные комбинации):

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

Но он продолжает выдавать ошибки.Какой хороший способ сделать это, кроме сортировки и получения верха / низа?

Спасибо!

Ответы [ 9 ]

48 голосов
/ 21 января 2011

max () не работает так, как вы ожидаете в SQL для Mongo.Возможно, это изменится в будущих версиях, но на данный момент max, min должны использоваться с индексированными ключами, главным образом, для шардинга.

см. http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

К сожалению, пока единственный способ получить максимальное значение - это отсортировать коллекцию по этому значению и взять первое.

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
19 голосов
/ 25 ноября 2011

Сортировка может быть излишней.Вы можете просто сделать группу по

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** }
            });
8 голосов
/ 24 мая 2013
db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)
5 голосов
/ 06 июня 2013

Пример кода оболочки mongodb для вычисления агрегатов.

см. Ручной ввод 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"}
    }
  } 
)
3 голосов
/ 30 марта 2015

Это будет работать согласно вашему требованию.

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
3 голосов
/ 24 мая 2013

Использовать агрегат ():

db.transactions.aggregate([
  {$match: {id: x}},
  {$sort: {sellprice:-1}},
  {$limit: 1},
  {$project: {sellprice: 1}}
]);
0 голосов
/ 03 ноября 2014

Следующий запрос делает то же самое: db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

Для меня это дало следующий результат: { "_id" : NumberLong(10934) }

0 голосов
/ 20 сентября 2011

Предполагая, что я использую драйвер Ruby (я увидел тег mongodb-ruby внизу), я бы сделал что-то вроде следующего, если бы хотел получить максимум _id (предполагая, что мой _id сортируется) , В моей реализации мой _id был целым числом.

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

Чтобы получить минимум _id в коллекции, просто измените :desc на :asc

0 голосов
/ 21 января 2011

Если столбец проиндексирован, то сортировка должна быть в порядке, при условии, что Mongo просто использует индекс для получения упорядоченной коллекции.В противном случае более эффективно перебирать коллекцию, сохраняя при этом наибольшее видимое значение.например,

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

(извиняюсь, если мой Ruby немного запутан, я давно его не использовал - но общий подход должен быть ясен из кода.)

...