MongoDB分组与分组项目

时间:2015-04-07 22:12:50

标签: 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:
}

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

我无法找出可以

的有效查询
  1. 按消息线程分组返回结果。
  2. 与分页合作。
  3. 按日期和主题排序。
  4. 我可以修改我需要的数据结构,以使其运行良好。

    以下是一些可能的解决方案,但它们似乎都不尽如人意:

    • 将消息存储为线程对象的子级。
    • 为每条消息添加一个threadId,然后按threadId进行查询和分组。
    • 创建一些有用的元信息对象。

    标准mongo group$group函数的问题在于我认为当集合很大时它会表现得非常糟糕。我们期待收藏中有数以亿计的消息。

1 个答案:

答案 0 :(得分:-1)

在邮件上添加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)
  

按日期和主题排序。

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