0

製品コレクションを持っています。ほとんどの製品には、カテゴリ、サブカテゴリ、およびサブサブカテゴリがあり、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 冊など)。

4

1 に答える 1

0

現在、それらを配列フィールド「カテゴリ」に保存しています。[「ドイツ語」、「文学」、「小説」]のようになります

"category"、"subcategory"、"sub-subcategory" という 3 つの異なるフィールドに対して 1 つの配列を使用しないでください。

また、言語を「言語」ではなくカテゴリとして保存するのはなぜですか? データベースの「スキーマ」に少しロジックを追加します。これは、物事がより複雑になったときに役立つからです。

そうすれば、配列内でクエリを実行する必要がなくなり、より正確な結果を得ることができるため、集計を使用する方がはるかに簡単になります (hadoop よりも高速で、シャード クラスターで可能です)。それらの値は非常に小さいため、次のように、フィールドの名前 (カテゴリの場合は「c」、サブカテゴリの場合は「sc」、サブサブカテゴリの場合は「scc」) にする必要があります。

{ _id : xxxxxxxxxxxx , name : "A novel of german literature" , c : "german", sc : "literature", ssc : "novels" }

私がやりたいことは、検索を行うことです。おそらく 10K の一致があり、ブラウザーに 100 を返し、クエリの見つかったカウントを含むカテゴリのリストも表示します。事前にカテゴリが何であるかはわかりません。また、変更される可能性もあります。

mongo はスキーマレスであるため、すべてのレコードにこのフィールドをすべて設定する必要はありません。製品間で大きく異なるスキーマを使用する予定がある場合は、製品ごとに異なるコレクションを使用する必要があるかもしれませんが、それはあなた次第です。

私がやりたいことは、検索を行うことです。おそらく 10K の一致があり、ブラウザーに 100 を返し、クエリの見つかったカウントを含むカテゴリのリストも表示します。事前にカテゴリが何であるかはわかりません。また、変更される可能性もあります。

インデックスをうまく利用し(多くの種類のインデックスがあり、おそらく複数のインデックスを使用する必要があります)、$group と$limitで集計を使用して、 100 レコードだけを返します。

これが機能する場合、ユーザーがカテゴリをクリックした後も同じです。結果は、そのカテゴリのサブカテゴリに対して集計され、サブサブカテゴリがあれば集計されます。

カテゴリのすべてのサブカテゴリを取得するサンプル クエリを次に示します (前述のスキーマを使用)。

 db.products.aggregate([{ $match : { "c" : "german"}},{ $group : { _id : {"c" : "$c"}, $addToSet :{ "subcategories" : "$sc"}}}])

このクエリは、現在のカテゴリに存在するすべてのサブカテゴリの配列を返します。

(カテゴリが単一の文字列ではなく配列である場合の更新されたクエリ)

 db.products.aggregate([{ $match : { "c" : {$elemMatch : {"german" : 1, "english" : 1}}}},{ $group : { _id : {"c" : "$c"}, $addToSet :{ "subcategories" : "$sc"}}}])
于 2013-10-09T14:36:28.130 に答える