0

私はmongodbを介した単純なメッセージングシステムに取り組んでいます。

私がユーザーAで、BとCからのプライベートメッセージを持っているとします。受信トレイビューに、私またはBまたはCから送信されたそれぞれの最後のメッセージを表示できるようにします。

たとえば、Facebookのメッセージングページを見てください。それが私がやりたいことです。

現在、「last.message」というフィールドがあり、2人のいずれかが送信した最後のメッセージを保存していますが、これを実装するためのより良い方法はありますか?

前もって感謝します。

4

2 に答える 2

1

2 つのコレクションを維持できます。

ファーストコレクション、

{ sender: UserA,
  receiver: UserB,
  latest_message: {message: String, timestamp: Date}
}

すべてのユーザー間のすべてのメッセージを格納する 2 番目のコレクション、

{ sender: UserA,
  receiver: UserB,
  message: String,
  timestamp: Date
}

最初のコレクションでは最新のメッセージのみが書き込まれ、最初のコレクションは頻繁に更新する必要があります。インデックスは と のよう{receiver : 1}になり{sender : 1}ます。

2 番目のコレクションには、すべてのメッセージが格納されます。これには頻繁な挿入があります。インデックスは、要件に似ている{receiver : 1, timestamp : -1}{receiver : 1, sender : 1, timestamp : -1}、要件に応じて異なります。

このアプローチを使用すると、一連の友人から最新のメッセージを非常に迅速かつ簡単に取得できます。複雑な条件のない 2 つの単純な検索クエリ。少し欠点がありますが、2 つのコレクションを維持する必要があります。そして、すべての新しいメッセージに対して、2 つの書き込みがあります。しかし、私の個人的な意見では、それはかなりきれいです。

最初のコレクションを維持するために、Redis のような RAM 内データベースの使用を検討することもできます。mongoにはキャッシングメカニズムが組み込まれており、最大のRAMを使用するため、それほど大きな違いはありませんが.

于 2012-12-15T16:50:06.590 に答える
1

メッセージには次のようなスキーマを使用できます。

{ sender: userA,
  receip: userB,
  participants: [userA, userB],
  date: < >,
  message: "xxx"
}

{ 参加者:1, 日付: -1 } にインデックスを付けると、そのインデックスを使用して、userX が参加者であったすべてのレコードを見つけることができ、そのインデックスを次のような集計フレームワーク クエリで使用できます。

db.messages.aggregate( [ 
    {$match:{participants:userX}}, 
    {$sort:{date:-1}}, 
    {$unwind:"$participants"}, 
    {$match:{participants:{$ne:userX}}, 
    {$group:{_id:"$participants", message:{$first:"$message"}, date: {$first:"$date"}} } 
] )

追加のコレクションを保持する必要はありません (したがって、追加の書き込みはありません)。集計クエリは、$match 操作と $sort 操作の両方で参加者、日付のインデックスを使用するため、非常に高速です。

于 2012-12-16T11:24:25.843 に答える