0

我正在通过 mongodb 开发一个简单的消息传递系统。

假设我是用户 A,有来自 B 和 C 的私人消息:在我的收件箱视图中,我希望能够显示来自每个人的最后一条消息,无论是从我还是从 B 或 C 发送的;

以 facebook 消息页面为例。这就是我想做的。

目前我有一个名为“last.message”的字段,其中存储了两个人发送的最后一条消息,但是,有没有更好的方法来实现这个?

提前致谢。

4

2 回答 2

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 这样的内存数据库来维护第一个集合。虽然它不会有那么大的区别,因为 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 回答