我正在通过 mongodb 开发一个简单的消息传递系统。
假设我是用户 A,有来自 B 和 C 的私人消息:在我的收件箱视图中,我希望能够显示来自每个人的最后一条消息,无论是从我还是从 B 或 C 发送的;
以 facebook 消息页面为例。这就是我想做的。
目前我有一个名为“last.message”的字段,其中存储了两个人发送的最后一条消息,但是,有没有更好的方法来实现这个?
提前致谢。
您可以维护 2 个集合。
第一次收藏,
{ sender: UserA,
receiver: UserB,
latest_message: {message: String, timestamp: Date}
}
第二个集合存储所有用户之间的所有消息,
{ sender: UserA,
receiver: UserB,
message: String,
timestamp: Date
}
在第一个集合中,仅写入最新消息,并且第一个集合需要频繁更新。索引可以是{receiver : 1}
和{sender : 1}
。
第二个集合存储每条消息。这将有频繁的插入。索引可以类似于{receiver : 1, timestamp : -1}
或{receiver : 1, sender : 1, timestamp : -1}
取决于您的要求。
通过这种方法,您可以快速而简单地从一组朋友那里获得最新消息。只需 2 个没有复杂条件的简单查找查询。虽然有一个小缺点,但您需要维护 2 个集合。对于每条新消息,您都有 2 次写入。但在我个人看来,它很干净。
您还可以考虑使用像 Redis 这样的内存数据库来维护第一个集合。虽然它不会有那么大的区别,因为 mongo 具有内置的缓存机制并利用最大的 RAM。
您可以将这样的模式用于消息:
{ 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 操作的日期,所以它应该非常快。