0

私はMongoDBで新しいアプリケーションを作成していますが、ドキュメント指向のモデリングスタイルが私のすべてのモデルに非常によく適合していることがわかりました。

しかし、私の1つの障害は、「チェックイン」スタイルのアクションです。ユーザーはある場所でチェックインできます。チェックインごとに次のものを保存する必要があります。

  • ユーザーID
  • プレイスID
  • チェックイン日

通常、これをユーザードキュメントの下に埋め込みとして保存しますが、次の質問を頻繁に行います。

  • ユーザーがチェックインしたすべての場所はどこですか?
  • 特定の場所で行われたすべてのチェックインは何ですか?
  • 特定のユーザーと場所の組み合わせのすべてのチェックイン?
  • 特定の時間枠内のユーザーまたは場所のすべてのチェックイン?

リレーショナルデータベースではこれは悲鳴has-many throughを上げますが、Mongoではそれほど明白な関係ではありません。チェックインをトップレベルのオブジェクトにして、結合スタイルのクエリのパフォーマンスヒットを取得する必要がありますか?また、時間の経過とともにチェックインオブジェクトにフィールドを追加する必要があるかもしれないので、ソリューションを柔軟に保ちたいと思います。

4

1 に答える 1

2

はい。ユーザードキュメント内に配列としてチェックインを埋め込む場合、「場所の最新の10回のチェックイン」というクエリはほぼ不可能になります。所定の場所に埋め込む場合も同様に、「ユーザーの最新の10回のチェックイン」は非常に困難になります。したがって、チェックインを独自のコレクションにします。

チェックインコレクションでuseridとplaceidの両方にインデックスを付ける場合、クエリは十分に高速である必要があります。たとえば、ユーザーJesseの最新のチェックインを検索するには、名前でユーザーを検索してJesseの_idを検索し、そのユーザーIDのチェックインを照会します。たった2つのクエリです。場所の最新のチェックインについても同じです。

場所の最新のチェックインをクエリし、ユーザーの名前が必要な場合は、最初にチェックインコレクションをクエリしてユーザーIDのリストを取得し、$inクエリを使用してすべてのユーザードキュメントを取得できます。繰り返しになりますが、これは2つのクエリであり、適切なインデックスを作成すると、両方とも完全にインデックスが作成されます。

于 2012-06-27T22:04:00.733 に答える