我的某些文档包含name: String
和version: Integer
。
我需要的是每个名称最高版本的文档列表。
所以我认为我需要在sql中执行等效的group by
,然后为每个名称的having
版本执行max
。
我不知道从哪里开始使用mongoDB。如果有人可以为mongo终端进行这个查询,这将是一个很好的开始,但额外的好处是专门为MongoMapper提供sytnax。
答案 0 :(得分:3)
如果您使用的是Mongodb 2.2及更高版本,则可以使用聚合框架和组管道运算符进行查询。
文档在这里:http://docs.mongodb.org/manual/reference/aggregation/
MongoMapper没有聚合框架的帮助程序,但您可以直接使用Ruby驱动程序(驱动程序版本1.7.0+具有聚合帮助程序方法)。您必须获取Mongo :: Collection的实例并在其上调用聚合方法。例如:
Model.collection.aggregate(["$group" =>
{"_id" => "$name",
"max_version" => {"$max" => "$version"}}
])
我希望有所帮助!
答案 1 :(得分:1)
如果您想通过Mongo DB进行分组,请检查Aggregation Framework,这是该工作的确切工具!
Here您将在GROUP BY,HAVING等聚合框架中找到相应的内容。
答案 2 :(得分:0)
感谢@Simon我看了一下MongoMapper的Map Reduce。我对它的看法可能并不完美,但它确实做了我想做的事情。这是实施:
class ChildTemplate
...
key :name, String
key :version, Integer, :default => 1
...
private
def self.map
<<-JS
function() {
emit(this.name, this);
}
JS
end
private
def self.reduce
<<-JS
function(key, values) {
var res = values[0];
for(var i=1; i<values.length; i++)
{
if(values[i].version > res.version)
{
res = values[i];
}
}
return res;
}
end
def self.latest_versions(opts = {})
results = []
opts[:out] = "ct_latest_versions"
ChildTemplate.collection.map_reduce(map, reduce, opts).find().each do |map_hash|
results << map_hash["value"]
end
return results
end