0

と を含む特定のドキュメントがname: Stringありversion: Integerます。

必要なのは、名前ごとの最高バージョンのドキュメントのリストです

group byしたがって、 in sql と同等の操作を行い、次にhavingfor maxversion per nameを実行する必要があると思います。

mongoDBでこれをどこから始めればよいかわかりません。誰かが mongo ターミナルに対してこのクエリを作成できれば、それは素晴らしいスタートですが、追加のボーナスは、特に MongoMapper の sytnax を提供することです。

4

3 に答える 3

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"}}
   ])

それが役立つことを願っています!

于 2013-06-03T16:13:01.273 に答える
1

Mongo DB でグループ化を行いたい場合は、Aggregation Frameworkを確認してください。

ここでは、GROUP BY、HAVING などの Aggregation Framework に相当するものを見つけることができます。

于 2013-05-17T11:24:15.993 に答える
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
于 2013-06-04T07:42:14.813 に答える