私は2つのコレクションを持っています:単語とフレーズ 各単語文書にはフレーズIDの配列があります。また、各フレーズをアクティブまたは非アクティブにすることができます。
言葉:例えば文書の配列数を調べる
{ "単語" => "こんにちは"、フレーズ=> [1,2]} {
"単語" => "テーブル"、フレーズ=> [2]}
フレーズ:
{"id" => 1 "フレーズ" => "hello world!"、 "active" => 1}
{"id" => 2、 "phrase" => "hello、i既に新しいテーブルを購入しました "、"アクティブ "=> 0)
各単語のアクティブフレーズの数を取得する必要があります。
私はこのようにそれを行うPHPで:
1.各単語のすべての単語
2.条件でアクティブなフレーズのカウントを取得する取得[「アクティブ」=> 1]
質問:どのようにすることができます1回のリクエストでアクティブなフレーズを含む単語が得られますか?私はMapReduceを使用しようとしましたが、アクティブなフレーズの数を得るために各単語をリクエストする必要があります。
UPD: 私のテストコレクションには、92 000フレーズと23000ワードがあります。
私はすでに、句の数とmongoのaggreagation関数を取得する各単語のphpループで両方のバリエーションをテストしました。
しかし、私はphrases_dataのために以下のコミットで集約パイプラインを変更しました。それは配列なので、$ matchを使用することはできません。 $ lookupの後に$ unwindを使用します。
[ '$unwind' => '$5'],
[
'$lookup' => [
'from' => 'phrases_926ee3bc9fa72b029e028ec90e282072ea0721d1',
'localField' => '5',
'foreignField' => '0',
'as' => 'phrases_data'
]
],
[ '$unwind' => '$phrases_data'],
[ '$match' => [ 'phrases_data.3' => 77] ], //phrases_data.3 => 77 it is similar to phrases_data.active => 1
[ '$group' =>
[
'_id' => ['word' => '$1', 'id' => '$0'],
'active_count' => [ '$sum' => 1]
]
],
[ '$match' => [ 'active_count' => ['$gt' => 0]] ],
[ '$sort' =>
[
'active_count' => -1
]
]
問題は、$ groupコマンドは、処理時間の80%を取るということです。そして、それはPHPのループよりもはるかに遅いです。ここではテストコレクションのための私の結果です:
あなたはアグリゲーションパイプラインの上に使用することができます
1. Php loop (get words-> get phrases count for each word): 10 seconds
2. Aggregation function : 20 seconds
あなたのmongoサーバのバージョンとphp mongoドライバのバージョンは何ですか? – Veeram
Mongo 3.2。、php mongoドライバがv1と思われる、わからないよ –