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