0

私は企業コレクションを持っています。

ビジネスはユーザーによってレビューされます。

各ユーザーは、ビジネスを 1 回だけレビューできます。将来のレビューは単に前のものを置き換えるだけです。

このように保管しております

 "Reviews" : {
    "gusyanto" : {
      "day" : "December 21, 2012, 8:08 am",
      "review" : "Tes review"
    },
    "sapi" : {
      "day" : "December 21, 2012, 8:18 am",
      "review" : "makanan ini sangat enak"
    }
  }

または、これを使用することもできます

 "Reviews" : [{
      "userid" : "gusyanto",
      "day" : "December 21, 2012, 8:08 am",
      "review" : "Tes review"
    },
    {
      "userid" : "sapi",
      "day" : "December 21, 2012, 8:18 am",
      "review" : "makanan ini sangat enak"}
    ]
  }

したがって、基本的には、キーがユーザー ID である辞書として格納したり、ユーザー ID がフィールド キーである配列として格納したりできます。したがって、2 番目のアプローチの鍵は静的、つまり userID です。

エントリにインデックスを付けたいと考えています。たとえば、ユーザーは自分がレビューしたビジネスを知りたい場合があります。

どのアプローチを使用する必要がありますか?

4

2 に答える 2

2

さて、私はこのようにします:

                          reviews (collection)
                                  |
                                  |
                    ______________|______________
                   |                             |
                 Doc 1                        Doc 2
  {"user_id": "USer1",                      {"user_id": "USer2",
   "review" : "Tes review",                  "review" : "makanan ini sangat enak",
   "date"   : "December 21, 2012, 8:08 am",  "date"   : "December 21, 2012, 8:08 am",
   "business": "Business1"                   "business": "Business2"
  }                                         }

そして、次のようにインデックスを作成できます。

  db.reviews.ensure_index([("user_id", ASCENDING), ("date", ASCENDING)])
  db.reviews.ensure_index([("business", ASCENDING), ("date", ASCENDING)])

次のようなクエリを ( log(n)時間で)実行できるようになりました。

  1. User1のすべてのレビューを 日付順に並べ替えて取得します。
  2. 日付順に並べ替えられたビジネスのレビューを取得します。

アップデート:

代わりに、次のようなことを選択したと仮定します。

                          Businesses (collection)
                                  |
                                  |
                    ______________|______________
                   |                             |
             BusinessDoc 1                    BusinessDoc 2
  {"business": "business1",                      {"user_id": "business",
   "review" : {..business1 reviews here..},     "review" : {..business2 reviews here..},
  }                                         }

ビジネスのすべてのレビュー、たとえば「B1」を 1 つのドキュメントにまとめることはお勧めしません。これは、「ビジネス」コレクションがある場合に発生することです。

「ビジネス」コレクションではない理由:

  1. クエリとインデックスが複雑になり、
  2. 非常に人気のある「BusinessX」のレビューが多すぎると、16MBの制限に達します。
于 2012-12-21T09:27:17.097 に答える
1

例として、あなたのドキュメントをそのまま取り上げます。ただし、日付を文字列形式で保存すると、インデックスとクエリの機能が損なわれる可能性があることに注意してください。

ここでフィールドにインデックスを作成する際の問題は、Reviewsあなたが持っているコンテンツ フィールドを確認することです。

単一のインデックス フィールドには大きすぎることは容易に想像できます。その場合、例外がスローされ、インデックスが作成されません ( http://docs.mongodb.org/manual/reference/limits/#Index%20Sizeおよびhttp://docs.mongodb.org/manual/core/indexes/#indexes-on-sub-documents )。これはおそらく、MongoDB のフル テキスト フィールドに関する最大の問題の 1 つです。

そのため、フィールド自体にインデックスを作成することはお勧めしません。

ただし、どのインデックスが最適かは、クエリにとって非常に主観的です。

いずれかのフィールドでのみクエリを実行する場合、つまり、day2useridつの個別のインデックスを作成しますが、クエリでフィールドを組み合わせる場合は、インデックスの複合版を使用する可能性が高くなります。

于 2012-12-21T09:44:28.020 に答える