0

それぞれが配列を保持している場合、mongodb が 2 つのフィールドにインデックスを作成できないという主な問題:

{a:[1,2], b: [8,9]}

そのため、次の問題を解決するのに苦労しています。

コレクションの説明

コレクション名:アイテム

  • 各アイテムは、多数 (数千) のフォルダーに属することができます
  • 各項目は、多数 (数千人) のユーザーに読まれる可能性があります。

集電構造(簡略化)

folderDataArr: [{
    _id: 1,
    dateOfAddingIntoFolder: 01.01.11
}, {
    _id: 2,
    dateOfAddingIntoFolder: 01.01.12
}],
userDataArr: [{
    _id: 100,
    isRead: true,
    dateOfRead: 01.0.10

}, {
    _id: 101,
    isRead: true,
    dateOfRead: 01.02.31


}]

ビルドするクエリ

効率的なクエリを作成するには、構造を再フォーマットする必要があります。

  • 一部のフォルダーに属し、特定のユーザーによって読み取られなかった最後の N 個のアイテムを返します。AND 結果は、そのニュースがフォルダーに追加された日付 (つまり、"dateOfAddingIntoFolder" フィールド) で並べ替える必要があります。

質問は

この問題を解決するにはどうすればよいですか?

助けてくれてありがとう。

4

1 に答える 1

0

はい、mongodb でコレクションを再構築する必要があります。新しいエンティティ「ニュース項目」が含まれているため、最終的な出力は未読のニュース項目です。次の方法をお勧めします。その前に、次のようにデータを視覚化しました

usercollection
- user (email id, last logged in time)

NewsCollection
- newsitem (newsid,newsdata,createdtimestamp,updatedtimestamp)

create、update などのニュース項目が変更されるたびに、createdtimestamp、updatedtimestamp をそれぞれ変更します

ユーザーがログインしている場合は、古いログイン タイムスタンプ (現在の更新前) を選択し、createdtimestamp または updatedtimestamp のいずれかで古いログイン タイムスタンプよりも大きいすべてのニュース アイテムを選択します。

: ニュース アイテムとユーザーは独立したエンティティであるため、それらを 1 つのコレクションに保持することはお勧めできません。

注*** : ユーザーとニュースは多対多の関係にあるため、ユーザー固有の高いニュース更新を提供しようとすると、より多くのドキュメント更新が必要になるか、ニュース/ユーザー関連の変更ごとに配列内のより多くの要素を操作する必要があります。これを行おうとしている場合は、アプリのパフォーマンスについて考えてください。

うまくいけば、これはあなたを助けるでしょう.

于 2013-10-26T19:35:23.430 に答える