0

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

1 条消息将能够发送给超过 1 人。

有人知道在 mongodb 无模式设计中这种类型的东西有一个好的模式吗?

我正在考虑在集合中有一个数组,该数组将包含另一个具有 3 个属性的文档。“收件人姓名”、“读取(布尔值)”和“已交付(布尔值)”。

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

我想我也需要另一个属性“发送者的姓名”,所以我能够重建发送的消息列表和状态

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

我的想法是正确的还是有更好的方法来实现这样的解决方案

4

1 回答 1

3

如果我理解正确,您想跟踪消息的状态。一条消息由一个人发送,但可以被许多人接收。消息的状态取决于我们正在谈论的收件人 - 乔可能已经阅读了蒂姆发来的消息,而莎莉在她的收件箱中有它但还没有阅读它,而琼还没有收到它。根据您的粗略要求,我将使用一个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(...) })
于 2015-01-12T16:17:08.257 回答