MongoDB 投影性能 - 还是只是许多小文档?

Posted

技术标签:

【中文标题】MongoDB 投影性能 - 还是只是许多小文档?【英文标题】:MongoDB Projection Performance - or just many small documents? 【发布时间】:2015-03-06 22:04:11 【问题描述】:

我正在为用户设置/首选项和其他与用户相关的内容构建一个集合。

目前一个文档是这样的:


  "_id": "USER_ID",
  "setting1":  "foo": "bar" ,
  "setting2": true,
  "setting3": "this might be a huuuuge email template",
  ...

我通过用户 ID 查询内容,然后使用投影来获取我需要的设置,即:

find( "_id":"USER_ID" , "setting2":1, "setting3":1 )

如果这样的文档会增长到 5 MB 并且有 500 个键怎么办?这仍然会表现良好吗?

或者我应该使用每个 USER_ID-SettingsKey-Tuple 的文档吗? (在userkey 上有索引)即:


  "_id":ObjectId("..."),
  "user": "USER_ID",
  "key": "setting1",
  "value":  "foo": "bar" 


  "_id":ObjectId("..."),
  "user": "USER_ID",
  "key": "setting2",
  "value": true

...

然后用find(user:"USER_ID", key:$in:[setting1, setting2])查询

对于每个用户的许多(和巨大的)设置,什么会表现得更好?

【问题讨论】:

【参考方案1】:

嵌套更好。更少的文档 = 更高的性能。 为了获得最佳性能,我会将您的设置分成 22 个类别,每个类别有 22 个键,这样访问一个属性最多需要 22+22=44 步而不是 500 步。当然,如果在全部。

在这里插入关于过早优化的愚蠢引用

【讨论】:

是的,我实际上并没有遇到性能问题,因为测试设置只有 20 个用户,每个用户有 50 个设置。 但是如果我现在可以用 1 小时的努力把事情做好,我就不必在几个月内大发雷霆,然后必须转换数千个文档,等等。;)。这个问题的主要原因是:也许在文档中找到一个键变得非常慢,所以投影变得非常慢。 它不是在文档中找到会很慢的键,而是在需要时将整个文档加载到内存中的所有 I/O 操作。我会默认使用您的第一个、最合乎逻辑的文档结构,然后看看您的内存/磁盘使用行为如何。

以上是关于MongoDB 投影性能 - 还是只是许多小文档?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Rust:类型化集合的投影|这个怎么做?

文档上缺少字段的 MongoDB 投影

MongoDB投影整个子文档

使用Spring-Integration获取具有某些字段(投影)的mongodb文档(仅限注释)

MongoDB

使用动态投影在 Mongodb 中进行聚合