大型数据集上的 MongoDB 子文档查询性能

Posted

技术标签:

【中文标题】大型数据集上的 MongoDB 子文档查询性能【英文标题】:MongoDB Subdocument Query Performance on Large Dataset 【发布时间】:2017-07-16 00:37:26 【问题描述】:

我在 MongoDB 中为对话创建了一个模式,其中消息存储为对话对象中的对象数组。

Conversation 
     company_id:  type:ObjectId, index: true ,
     messages: [
                  _id:  type: ObjectId, index: true 
     ]

我有一个查询,它根据数组中发送的第一条消息(从应用程序的另一部分发送)的 company_id 和 _id 查找对话。

Conversation.findOne( company_id: c_id, messages._id: firstMessage )

理论上,如果一家公司有 1 亿个对话,并且每个对话有 100 万条消息,那么查询子文档会有多少性能问题,而不是我将第一个消息 id 存储在主文档中仅记录和查询基础对象?

Conversation 
     company_id:  type:ObjectId, index: true ,
     firstMessage_id:  type:ObjectId, index: true ,
     messages: [
                  _id:  type: ObjectId, index: true 
     ]


Conversation.findOne( company_id: c_id, firstMessage_id: firstMessage )

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

如果您的个人消息为 100 万条,我会将它们完全保存在一个单独的集合中,并使用 3.4 版中聚合框架的 $lookup 来为您提供结果。当然,我会假设两个集合中都有适当的索引,并且使用适当的过滤器来匹配公司。

【讨论】:

马里奥,谢谢你的回答。实际上,我将消息作为一个单独的集合,其中 id 存储在对话中,但是我更想知道对象查找与子对象查找的查询计算。

以上是关于大型数据集上的 MongoDB 子文档查询性能的主要内容,如果未能解决你的问题,请参考以下文章

大型数据集上的核心数据获取请求缓慢

大型数据集上的 R 中的矩阵数学

大型数据集上的 R 中的 hclust()

MongoDB报表实例方案选型

在大型数据集上使用 JOIN 运行 SQL 查询

基于条件的 2 个大型数据集上的模糊模糊字符串匹配 - python