Для меня это дало следующий результат:

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

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

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

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

Спасибо!

 Andy Lindeman21 янв. 2011 г., 20:41
Вы должны включить ошибки, которые он выдает.

Ответы на вопрос(9)

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

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

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

 Anurag11 окт. 2012 г., 23:20
Разве find_one () не будет лучше, чем использование limit ()?result = my_collection.find_one({}, :sort => ['_id', :desc])

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

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** }
            });
 Thomas Decaux25 июн. 2012 г., 20:24
Это абсолютно правильный способ сделать это с MongoDB!
 aioobe11 мая 2014 г., 20:34
Я бы не сказал, что это излишество, учитываяэта цитата из руководства «Когда $ sort непосредственно предшествует $ limit в конвейере, операция $ sort поддерживает только верхние n результатов по мере продвижения, где n - указанный предел»

db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

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

Решение Вопроса

как вы ожидаете в 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()

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

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

см. ручной ввод 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"}
    }
  } 
)

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

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

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

 Thomas Decaux25 июн. 2012 г., 20:18
Рассмотрим итерацию с MapReduce !!! Вот почему MongoDB это круто, иначе использовать плоские файлы ;-)

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

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
 Asieh hojatoleslami30 мар. 2015 г., 13:50
лучше добавить комментарий к вашему коду
 Dan Dascalescu07 окт. 2018 г., 02:48
Какой смысл этого ответа? Повторять принятый ответ?
db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)

Ваш ответ на вопрос