Noo*_*ber 6 database mongodb database-schema
我正在尝试为mongodb. 我有两种类型的用户模型 -Producer和Consumer. 生产者和消费者可以相互对话。我的最终目标是获取任何生产者和消费者的所有对话并将它们显示在列表中,就像所有消息传递应用程序(例如 Facebook)一样。
这是schema我想出的:
Producer: {
_id: 123,
'name': "Sam"
}
Consumer:{
_id: 456,
name: "Mark"
}
Conversation: {
_id: 321,
producerId: 123,
consumerId: 456,
lastMessageId: 1111,
lastMessageDate: 7/7/2018
}
Message: {
_id: 1111,
conversationId: 321,
body: 'Hi'
}
Run Code Online (Sandbox Code Playgroud)
现在我想取回 Sam 的所有对话。我想像 Facebook 一样将它们显示在列表中,将它们与每个消费者分组并根据时间进行排序。我想我需要为此做以下查询:
1) 获取123按 lastMessageDate 排序的所有对话。然后我可以显示所有对话的列表。
2)如果我想知道对话中的所有消息,我会查询消息并获取conversationId所在的所有消息 321
现在,对于每个 new message,我还需要conversation每次都使用新的 messageId 和 date 更新。考虑到所涉及的查询数量,这是正确的继续方式吗?有没有更好的方法可以继续执行此操作?任何帮助将不胜感激。
设计: 我不会说它很糟糕。根据您描述的情况,它实际上非常好。对上一条消息日期和 ID 的这种非规范化非常有用,尤其是当您计划一个包含所有对话列表的视图时 - 您在同一个查询中拥有上一条消息的日期。如果在此视图中适用,甚至可以更进一步并添加最后一条消息文本。
您可以在 MongoDB 博客(第1部分、第2部分和第3部分)上阅读有关非规范化(以及一般的模式建模)的优缺点的更多信息。它不是那么新鲜,但并不过时。
此外,如果这种多文档更新可能会因某些可能的不一致而使您感到害怕,那么 MongoDB v4 可以为您提供事务处理。
查询: 一方面,您可以涉及多个查询,而且一点也不差(特别是当其中很少有可以轻松缓存的时候,例如生产者或消费者数据)。另一方面,如果需要,您可以使用聚合一次获取所有这些内容。