Получение максимального значения столбца в MongoDB
Я немного помог получить максимальную ценность в столбце для документа mongo. Я могу сортировать его и получить верх/низ, но я уверен, что есть лучший способ сделать это.
Я пробовал следующие (и разные комбинации):
transactions.find("id" => x).max({"sellprice" => 0})
Но он продолжает бросать ошибки. Какой хороший способ сделать это, кроме сортировки и получения верхней/нижней?
Спасибо!
Ответы
Ответ 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) }