mongodb消息传递 - 获得其中一个

时间:2012-12-15 16:05:01

标签: php mongodb

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

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

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

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

提前致谢。

2 个答案:

答案 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操作的日期,因此它应该非常快。