Подтвердить что ты не робот

Получение максимального значения столбца в MongoDB

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Пример кода оболочки 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"}
    }
  } 
)

Ответ 5

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

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

Ответ 6

Использовать aggregate():

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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