首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带分组项的MongoDB分页

带分组项的MongoDB分页
EN

Stack Overflow用户
提问于 2015-04-07 22:12:50
回答 1查看 151关注 0票数 1

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

代码语言:javascript
复制
{
  id: "",
  inResponseToMessageId: ""
  to: []
  cc: []
  bcc: []
  subject: ""
  body: ""
  owners: [{id:4, status:"read", folder:"inbox"}, {id:1, status:'unread', folder:'inbox'}]
  dateSent:
}

客户端希望我们能够同时在会话视图单例视图中显示消息。

我很难找到一个高效的查询

  1. 返回按消息线程分组的结果。
  2. 用分页很好地工作。
  3. 按日期和主题分类。

我可以修改数据结构,但是我需要这样做才能让它正常工作。

下面的是一些可能的解决方案,但它们似乎都不够用:

  • 将消息存储为线程对象的子对象。
  • 向每个消息中添加一个threadId,然后按threadId进行查询和分组。
  • 创建某种类型的帮助元信息对象。

标准mongo、group$group函数的问题是,当集合很大时,它的性能会很差。我们预计集合中将有数亿条消息。

EN

回答 1

Stack Overflow用户

发布于 2015-04-08 14:49:46

在你的信息上放一个threadId

返回按消息线程分组的结果。

您可以通过线程找到以下消息:

代码语言:javascript
复制
db.messages.find({ "threadId" : id })

我认为没有必要像$group操作符那样对它们进行分组。

用分页很好地工作。

按什么顺序对邮件进行分页?如果您在一个唯一的字段上有一个排序,分页工作得很好。如果保持毫秒精度,dateSent应该是唯一的,因此您可以对其进行分页。

代码语言:javascript
复制
// 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)

按日期和主题分类。

谁按主题对信息进行排序?无论如何,如果您想按日期或主题顺序检索消息,这只是创建正确的索引的问题。根据您的需求,您可能会对客户端视图执行这种排序,在那里可能不需要让数据库对结果进行排序。客户端可以对返回的子集执行此操作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29502302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档