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

MongoDB: Designing a db for saving chats / offline / undelivered chats

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

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

有人知道 mongodb 无模式设计中此类事物的良好模式吗?

我想在集合中有一个数组,其中包含另一个具有 3 个属性的文档。"name of person addressed to"、"read (boolean)" 和 "delivered (boolean)"。

通过这种方式,我可以在运行时使用点符号进入数据库,查找所有发给特定人员的消息、所有未读消息、所有未送达的消息等。

我想我也需要另一个属性 "name of person sent from",所以我能够重建已发送消息列表和状态

有没有人看到一个好的设置?

我的想法是否正确,或者是否有更好的方法来实现这样的解决方案

如果我没理解错的话,你想跟踪消息的状态。一条消息由一个人发送,但可以被多人接收。邮件的状态取决于我们正在谈论的收件人 - 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 }
}

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

all messages addressed to a specific person

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

all unread messages [sent to a specific person?]

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

all undelivered messsages [sent to a specific person?]

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

rebuild the a list of messages sent and there status

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