Performance 使用分组项的MongoDB分页
我正在将消息传递模块构建到现有的web应用程序中。我们将消息存储在mongo中,数据结构如下所示:Performance 使用分组项的MongoDB分页,performance,mongodb,pagination,Performance,Mongodb,Pagination,我正在将消息传递模块构建到现有的web应用程序中。我们将消息存储在mongo中,数据结构如下所示: { id: "", inResponseToMessageId: "" to: [] cc: [] bcc: [] subject: "" body: "" owners: [{id:4, status:"read", folder:"inbox"}, {id:1, status:'unread', folder:'inbox'}] dateSent: } 客
{
id: "",
inResponseToMessageId: ""
to: []
cc: []
bcc: []
subject: ""
body: ""
owners: [{id:4, status:"read", folder:"inbox"}, {id:1, status:'unread', folder:'inbox'}]
dateSent:
}
客户希望我们能够在对话视图和单例视图中显示消息
我很难找到一个可以
返回按消息线程分组的结果。
可以很好地进行分页。
可按日期和主题排序。
我可以修改数据结构,但我需要,以使其工作良好
以下是一些可能的解决方案,但它们似乎都有不足之处:
将消息存储为线程对象的子对象。
将threadId添加到每条消息,然后按threadId进行查询和分组。
创建一些有帮助的元信息对象类型。
标准mongo group或$group函数的问题在于,我认为当集合很大时,它的性能会非常差。我们预计集合中会有数亿封邮件。在邮件上添加threadId
返回按消息线程分组的结果
您可以通过类似线程的方式查找消息
db.messages.find({ "threadId" : id })
我认为没有必要按照$group操作符的意义对它们进行分组
可以很好地进行分页
消息的分页顺序是什么?如果对唯一字段进行排序,分页效果很好。如果将dateSent保持为毫秒精度,则它应该是唯一的,以便可以对其进行分页
// page 1
db.messages.find({ "threadId" : id }).sort({ "dateSent" : -1 }).limit(25)
// page 2
db.messages.find({ "threadId" : id, "dateSent" : { "$gt" : <25th date sent> } }).sort({ "dateSent" : -1 }).limit(25)
可按日期和主题排序
谁按主题对邮件进行排序?无论如何,如果您想按日期或主题顺序检索消息,这只是创建正确索引的问题。根据您的需求,您可能会对客户机视图执行此排序,在这种情况下,可能不需要让数据库对结果进行排序。客户端可以为返回的子集执行此操作。我知道这不是您所要求的,但是:Mongo真的是一个要求,还是您可以灵活地选择文档存储?你所描述的问题实际上是一个关系问题。。。如果您可以选择其他存储解决方案,那么我建议使用OrientDB而不是Mongo,因为它可以充当文档存储,您的手不会像现在这样被束缚。无论你选择哪一个,我建议你实际运行一些基准测试,看看你的期望是否与实际性能相符@伊苏特。谢谢你的回复。我很乐意使用关系数据库,但我认为它不能解决问题。你能详细说明一下关系模型会有什么帮助吗?首先,很抱歉延迟回复!如果您存储的是严格的层次结构数据,并且您确信您的模式是。。。将永远是静止的。这个问题的一个典型例子是,我强烈推荐阅读它。回到最后一点:你不确定你的客户的需求在未来是否会改变,到那时你可能已经把自己编码到一个角落里,使转换到其他东西非常痛苦。这是行不通的。您的查询将返回消息,但它们不会按线程分组。如果最近的25条消息都属于同一个线程,那么它只返回1个线程的消息,而不是25个线程的消息。收件箱需要显示25个线程,而不是1个。