我一直在帮助获取mongo文档列的最高值。我可以对它进行排序并获得顶部/底部,但我很确定有更好的方法可以做到这一点。
我尝试了以下(和不同的组合):
transactions.find("id" => x).max({"sellprice" => 0})
但它一直在抛出错误。除了排序和获得顶部/底部之外,有什么好的方法呢?
谢谢!
答案 0 :(得分:48)
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()
答案 1 :(得分:19)
排序可能有点过分。您可以通过
进行分组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** }
});
答案 2 :(得分:8)
db.collectionName.aggregate(
{
$group :
{
_id : "",
last :
{
$max : "$sellprice"
}
}
}
)
答案 3 :(得分:5)
用于计算聚合的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"}
}
}
)
答案 4 :(得分:3)
使用aggregate():
db.transactions.aggregate([
{$match: {id: x}},
{$sort: {sellprice:-1}},
{$limit: 1},
{$project: {sellprice: 1}}
]);
答案 5 :(得分:3)
它将按照您的要求工作。
transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
答案 6 :(得分:0)
如果列被索引,那么排序应该没问题,假设Mongo只使用索引来获取有序集合。否则,迭代集合会更有效,记录下看到的最大值。 e.g。
max = nil
coll.find("id" => x).each do |doc|
if max == nil or doc['sellprice'] > max then
max = doc['sellprice']
end
end
(道歉,如果我的Ruby有点松懈,我很长时间没有使用它 - 但是从代码中可以清楚地看到一般的方法。)
答案 7 :(得分:0)
假设我使用的是Ruby驱动程序(我在底部看到了mongodb-ruby标记),如果我想得到最大值_id
,我会做类似以下的事情(假设我的_id
是可排序的)。在我的实现中,我的_id
是一个整数。
result = my_collection.find({}, :sort => ['_id', :desc]).limit(1)
要获得集合中的最低_id
,只需将:desc
更改为:asc
答案 8 :(得分:0)
以下查询执行相同的操作:
db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)
对我来说,这产生了以下结果:
{ "_id" : NumberLong(10934) }