2

以下のようなドキュメントを含むmongodbコレクションがあります。

[
  {
  :event => {:type => 'comment_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'}
  }

,
  {
  :event => {:type => 'vote_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'}
  }
]

私が必要としているのは、各アイテムの最新のアクティビティ(当日)を集約した「ダッシュボード」を作成することです。結果は次のようになります。

{
:item_id => 10,
:events => {
  :vote_created => [.. ordered list with latest 3 vote_created events/documents],
  :comment_created => [.. ordered list with latest 3 comment_created events/documents ],
  }
}

結果は、次のような「Facebookスタイル」の構文を構築するために使用されます。「マイク、ジョン、および他の3人が今日あなたのアイテムにコメントを追加しました。」

グループまたはmap-reduce関数を使用してこのデータを集約するにはどうすればよいですか?

4

2 に答える 2

4

OK、これを行うには2つの方法があります。

方法#1:Map-Reduce

したがって、最初に、グループではなく、map-reduceを実行する必要があります。

新しいコレクションを生成する「out」変数でMap-Reduceを使用します。その後、その新しいコレクションに対してサマリークエリを実行できるようになります。

これを行う理由は、高価なクエリを要求しているため、「かなりではない」リアルタイムでアクセスする方がはるかに合理的です。

方法2:二重書き込み

基本的に、「詳細」(上の1つ)と「要約」(下の1つ)の2つのコレクションを維持できます。詳細に書き込むときはいつでも、要約の更新も実行してください。

MongoDBにはいくつかの配列メソッド($ push、$ pull、$ Slice)があり、「vote_created」配列を最新の状態に保つことができます。

環境設定

選択する方法は、使用しているアーキテクチャのタイプと必要なユーザーエクスペリエンスによって完全に異なります。個人的には、メソッド#2を使用して、「vote_created」配列に追加し続けます。「マイク、ジョン、その他3人...」の構文をビューのどこかに配置します。b/cこれは実際にはDBロジックではなくビューロジックです。

はい、方法2はより多くのスペースを必要としますが、多くの質問にすばやく答えることもできます。したがって、その速度を得るには、スペースを犠牲にする必要があります。

于 2010-11-19T17:25:49.967 に答える
0

http://rickosborne.org/download/SQL-to-MongoDB.pdf

于 2010-11-19T11:01:11.817 に答える