MongoDB:设计用于保存聊天/离线/未传递聊天的数据库

时间:2015-01-08 05:43:11

标签: mongodb mongoose chat schemaless

我正在尝试创建一个mongodb设计来支持聊天应用程序。系统需要将消息写入一个状态为deliver(boolean)和read(boolean)的集合。

1条消息可以发送给1个以上的人。

有人知道mongodb无架构设计中这类东西的好架构吗?

我想在集合中有一个数组,其中包含另一个具有3个属性的文档。"发送给",#34; read(boolean)"和#34;交付(布尔)"。

这种方式在运行时我可以使用点符号进入数据库,找到发给特定人的所有消息,所有未读消息,所有未传递的消息等。

我想我还需要另外一个属性"从"发送的人的名字,所以我能够重建发送的消息列表和状态

有没有人看到过这方面的好设置?

我是否正确地思考这个问题,或者是否有更好的方法来实现这样的解决方案

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望跟踪消息的状态。消息由一个人发送,但可以被许多人接收。消息的状态取决于我们正在谈论的收件人 - Joe可能已经阅读了Tim发来的消息,而Sally将其放在收件箱中但尚未阅读,并且Joan还没有收到还没完成。根据您的粗略要求,我会使用message_status集合对此进行建模,其中每个文档代表一条消息相对于一个收件人的状态:

{
    "message_id" : ObjectId(...) // some unique identifier or reference for the message
    "sender" : { "name" : "Tim", "ref" : ObjectId(...) }
    "recipient" : { "name" : "Sally", "ref" : ObjectId(...) }
    "status" : { "delivered" : true, "read" : false }
}

我不清楚我需要在多大程度上使用引用而不是仅仅嵌入名称,因为没有指定完整的用例。获得您提到的各种信息非常简单:

  

发给特定人的所有邮件

db.message_status.find({ "recipient" : ObjectId(...) })
  

所有未读消息[发送给特定的人?]

db.message_status.find({ "recipient" : ObjectId(...), "status.read" : false })
  

所有未送达的消息[发送给特定的人?]

db.message_status.find({ "recipient" : ObjectId(...), "status.delivered" : false })
  

重建已发送的邮件列表并显示状态

db.message_status.find({ "sender" : ObjectId(...) })