我正在尝试创建一个mongodb设计来支持聊天应用程序。系统需要将消息写入一个状态为deliver(boolean)和read(boolean)的集合。
1条消息可以发送给1个以上的人。
有人知道mongodb无架构设计中这类东西的好架构吗?
我想在集合中有一个数组,其中包含另一个具有3个属性的文档。"发送给",#34; read(boolean)"和#34;交付(布尔)"。
这种方式在运行时我可以使用点符号进入数据库,找到发给特定人的所有消息,所有未读消息,所有未传递的消息等。
我想我还需要另外一个属性"从"发送的人的名字,所以我能够重建发送的消息列表和状态
有没有人看到过这方面的好设置?
我是否正确地思考这个问题,或者是否有更好的方法来实现这样的解决方案
答案 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(...) })