mongodb / nosql:メッセージの読み取り /未読ステータスを処理するための最良のアプローチ

StackOverflow https://stackoverflow.com/questions/4180817

質問

多数のユーザー(M)と多数のドキュメント(n)があり、各ユーザーが各ドキュメントを読み取りまたは未読としてマークすることを望んでいるとします(メールシステムと同じように)。 Mongodbでこれを表現する最良の方法は何ですか?または他のドキュメントデータベースはありますか?

StackoverFlowには、リレーショナルデータベースについてこの質問をする質問がいくつかありますが、ドキュメントデータベースの推奨事項はありませんでした。

複数のアイテムにわたって読み取り/未読ステータスを覚えている最も効率的な方法は何ですか?

「未読のコメント」カウンターの効率的なシステムを実装する

通常、回答には、ユーザーが読んだすべてのものをリストするテーブルが含まれます。その日より前は「読み取り」です。

それで、mongodb / nosqlの専門家、この問題に実際にどのようなアプローチを見たことがあり、どのようにパフォーマンスしましたか?

役に立ちましたか?

解決

{
_id: messagePrefs_uniqueId,
type: 'prefs',
timestamp: unix_timestamp
ownerId: receipientId,
messageId: messageId,
read: true / false,
}

{
_id: message_uniqueId,
timestamp: unix_timestamp
type: 'message',
contents: 'this is the message',
senderId: senderId,
recipients: [receipientId1,receipientId2]
}

好みを取得したい3つのメッセージがあるとしましょう。次のようなものを介してそれらを取得できます。

db.messages.find({
messageId : { $in : [messageId1,messageId2,messageId3]},
ownerId: receipientId, 
type:'prefs'
})

必要なのが読み取り/未読の場合は、MongodbのUpSert機能でこれを使用できます。そのため、ユーザーが実際に読み取らない限り、各メッセージのPREFSを作成していません。 。 (タグやフォルダーなどの柔軟性が必要な場合は、おそらくメッセージの各受信者のPREFを作成することをお勧めします。たとえば、追加できます。

tags: ['inbox','tech stuff']

プリフェスオブジェクトに、そして「技術的なもの」でタグ付けされたすべてのメッセージのすべてのプリフを取得するには、次のようなものになります。

db.messages.find({type: 'prefs', ownerId: recipientId, tags: 'tech stuff'})

次に、Prefsに照会して、次のすべてのメッセージを見つけるためにPrefssに表示されるMessageIDを使用できます。

db.messages.find((type:'message', _id: { $in : [array of messageIds from prefs]}})

それぞれの「タグ」に効率的に含まれるメッセージの数を数えるようなことをしたい場合は、少し難しいかもしれません。それがほんの一握りのタグである場合、あなたはただ追加することができます .count() クエリごとにクエリの最後まで。数百または数千の場合、マップ/削減サーバーサイドスクリプト、またはユーザーごとのタグごとのメッセージカウントを追跡するオブジェクトを使用すると、より良いことができます。

他のヒント

読み取り/未読のような単純なブール値のみを保存する場合、別の方法は、それを読んだユーザーのリストを含む各ドキュメントに配列を埋め込むことです。

{
  _id: 'document#42',
  ...
  read_by: ['user#83', 'user#2702']
}

その後、そのフィールドにインデックスを作成し、ドキュメントの読み物とユーザー(Who-read-Documentの高速クエリを作成できるはずです。

db.documents.find({read_by: 'user#83'})

db.documents.find({_id: 'document#42}, {read_by: 1})

しかし、私は通常、持っているすべてのドキュメントをクエリしていることがわかります いいえ 特定のユーザーによって読まれましたが、この場合、インデックスを利用できるソリューションは考えられません。両方を持たずにこれを速く作ることは不可能だと思います read_byunread_by すべてのユーザーがすべてのドキュメント(または参加テーブル)に含まれるように配列がありますが、それには大きなストレージコストがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top