Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用分组项的MongoDB分页_Performance_Mongodb_Pagination - Fatal编程技术网

Performance 使用分组项的MongoDB分页

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: } 客

我正在将消息传递模块构建到现有的web应用程序中。我们将消息存储在mongo中,数据结构如下所示:

{
  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个。