为啥 MongoDB 文档建议不要使用 DBREF?

Posted

技术标签:

【中文标题】为啥 MongoDB 文档建议不要使用 DBREF?【英文标题】:Why do the MongoDB docs recommend not using DBREFs?为什么 MongoDB 文档建议不要使用 DBREF? 【发布时间】:2016-04-09 15:06:22 【问题描述】:

MongoDB docs for DBREFs 说:

除非您有令人信服的理由使用 DBRefs,否则请改用手动引用。

为什么? DBREF 似乎更易于使用,因为它们对数据库和集合名称进行编码,这将减少应用程序中的硬编码。另外,DBREF 是a standard format that many drivers understand。

这个问题是相关的,但不完全相同:

MongoDB - is DBREF necessary?

这个问题的答案是嵌入/非规范化比链接更可取,但它没有回答为什么手动链接比 DBREF 更可取的问题。

【问题讨论】:

简而言之,这是因为它在大多数情况下都是多余的,因为您最终会在每个 DBRef 中存储相同的集合名称,这会增加文档的大小。 @JohnnyHK,这点很好,但在使用 WiredTiger 存储引擎时可能不适用mongodb.com/blog/post/new-compression-options-mongodb-30 【参考方案1】:

这里是我所看到的所有结论。

使用DBRef不是join操作,它会自动查询第二次或更多次,取决于你在这个集合字段中有多少DBRef

假设你有一个集合,它的模型有 10 个 DBRef,你查询它的 10 个元素列表,其中一个 DBRefreally needed。一旦您查询,Mongodb 将自动运行101(1 + 10*10) 查询,无论您是否需要这些DBRef。如果您手动查询这些字段,只需要一些编码,并且只需要 11(1 + 1*10) 查询。

那么,你说什么?

【讨论】:

听起来有道理,只要我可以验证,很高兴标记为正确:您有此信息的来源或如何验证的示例? 嗯,刚刚测试过了。我在 mongodb 中启用了分析,并对 A 类进行了全部查询,该 A 类具有 B 类的 3 个 DBRef 字段。查询返回 4 A。在日志中,它显示集合 A 中的 1 个查询和集合 B 中的 12 个查询。你可以自己测试一下,很难在评论中粘贴日志消息。 而且,在spring-boot-starter-data-mongodb的日志中,只显示了一个查询。 这是一个很好的观点@Kroderia,但这些引用不会自动填充。来自文档:驱动程序 [1] 不会自动将 DBRefs 解析为文档。这意味着您仍然可以选择使用未解析的引用查询原始文档并保存这些请求。 @kroderia,听起来您使用的抽象层/OOM 会产生错误的查询。

以上是关于为啥 MongoDB 文档建议不要使用 DBREF?的主要内容,如果未能解决你的问题,请参考以下文章

spring data mongo使用@DBRef,怎么查询指定字段的集合

为啥建议不要在 Node.js 代码的任何地方关闭 MongoDB 连接?

为啥建议不要在 Node.js 代码的任何地方关闭 MongoDB 连接?

mongodb 16m限制怎么设计

使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef

MongoDB DBRef 列表在 Spring Boot 中返回 null