製品コレクションを持っています。ほとんどの製品には、カテゴリ、サブカテゴリ、およびサブサブカテゴリがあり、1 つまたは 2 つしかない製品もあります。現在、それらを配列フィールド「カテゴリ」に保存しています。タイプ「本」の製品の場合、[「ドイツ語」、「文学」、「小説」]のようになります(約15のタイプがあり、それぞれに独自のカテゴリ ツリー)。
私がやりたいことは、検索を行うことです。おそらく 10K の一致があり、ブラウザーに 100 を返し、クエリの見つかったカウントを含むカテゴリのリストも表示します。事前にカテゴリが何であるかはわかりません。また、変更される可能性もあります。
私が見ているさまざまな方法:
- MapReduceですが、これは「遅い」と聞いており、ライブ検索よりも毎日の統計に適しています
- 私が得た 1 つの提案は Aggregation->$group: でした。これを見ましたが、値を単に合計または平均するのではなく、値をカウントする方法がわかりません。何か不足していますか?
- すべての製品について、カテゴリ フィールドのみを返す 2 番目の検索を実行して、製品コードでカウントを実行できるようにします。
- 各カテゴリに対してループ検索を実行し、単にカーソルの count() を返します。これが機能するためには、明らかにカテゴリを知る必要があり、それは最後の手段のようです..
基本的に私の質問は「最善の方法は何ですか?」です。それはかなり高速で、スケーリングする必要があります。
これが機能する場合、ユーザーがカテゴリをクリックした後も同じです。結果は、そのカテゴリのサブカテゴリに対して集計され、サブサブカテゴリがあれば集計されます。
追加情報: コレクションには数百万の製品が含まれる可能性があります。まだデータがないため、それに対してテストするのは困難です。現在、約 50,000 製品のみです。 "製品")。
カテゴリを正しい方法で保存していますか、それとも別のフィールドにする必要がありますか? 現在、配列には 3 つの項目がありますが、これは後で増える可能性があります。
MongoDB は初めてで、これまでのところ MySQL でしかうまくいきませんでした..
カテゴリーを明確にする。タイプが「本」の製品の例では、「ドイツ語」がメイン カテゴリ、「文学」がサブカテゴリ、「小説」がそのサブサブカテゴリになります。その他のメイン カテゴリは 5 ~ 6 のその他の言語 (書籍用) で、その他のサブカテゴリは「学術と研究」、「ビジネス」、「旅行と言語」などです。サブサブカテゴリは、サブカテゴリに依存します (その最後の SSC は、「外国語研究」、「社会言語学」などです)。製品ごとに、配列として 3 つすべてを 1 つのフィールドに格納しています。
タイプ「book」で「foo」を検索すると、英語で 123 個の製品、ドイツ語で 456 個の製品、フランス語で 789 個の製品が見つかります。
次に、誰かが「ドイツ語」を選択すると、別のクエリが実行され、見つかったドイツ語の書籍の数がサブカテゴリ別に表示されます (「学術と研究」では 44 冊、「ビジネス」では 57 冊など)。