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を使用するため、それほど大きな違いはありませんが.