我正在通过mongodb开发一个简单的消息传递系统。
假设我是用户A,拥有来自B和C的私人消息:在我的收件箱视图中,我希望能够显示来自我或B或C发送的每条消息;
以facebook消息页面为例。这就是我想做的事。
目前我有一个名为“last.message”的字段,我存储了这两个人中任何一个发送的最后一条消息,但有没有更好的方法来实现它?
提前致谢。
答案 0 :(得分:1)
您可以维护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这样的RAM内数据库来维护第一个集合。虽然它不会有这么大的差别,因为mongo具有内置的缓存机制并且利用最大的RAM。
答案 1 :(得分:1)
您可以将这样的架构用于消息:
{ sender: userA,
receip: userB,
participants: [userA, userB],
date: < >,
message: "xxx"
}
如果索引{participant:1,date:-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操作的日期,因此它应该非常快。