如何构建这个mongoDB查询(mongomapper)

时间:2013-05-17 11:09:24

标签: ruby mongodb group-by mongomapper having

我的某些文档包含name: Stringversion: Integer

我需要的是每个名称最高版本的文档列表

所以我认为我需要在sql中执行等效的group by,然后为每个名称的having版本执行max

我不知道从哪里开始使用mongoDB。如果有人可以为mongo终端进行这个查询,这将是一个很好的开始,但额外的好处是专门为MongoMapper提供sytnax。

3 个答案:

答案 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