Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MongoDB文档建议不要使用DBREFs?_Mongodb_Join_Reference - Fatal编程技术网

为什么MongoDB文档建议不要使用DBREFs?

为什么MongoDB文档建议不要使用DBREFs?,mongodb,join,reference,Mongodb,Join,Reference,他们说: 除非您有充分的理由使用DBRefs,否则请改用手动引用 为什么??DBREF似乎更易于使用,因为它们对数据库和集合名称进行编码,这将减少应用程序中的硬编码。另外,DBREF是 这个问题是相关的,但并不完全相同: 这个问题的答案是嵌入/非规范化比链接更可取,但它没有回答为什么手动链接比DBREFs更可取的问题。这里是我所看到的所有结论 使用DBRef不是一个join操作,它将自动查询第二次或更多次,具体取决于您在此集合字段中获得的DBRef 假设您有一个集合,它的模型有10个DBRef

他们说:

除非您有充分的理由使用DBRefs,否则请改用手动引用

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

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


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

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

使用
DBRef
不是一个
join
操作,它将自动查询第二次或更多次,具体取决于您在此集合字段中获得的
DBRef

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


那么,你怎么说呢?

简而言之,这是因为在大多数情况下,当你最终在每个DBRef中存储相同的集合名称时,这会使你的文档变得臃肿。@JohnnyHK,这是一个很好的观点,但在使用WiredTiger存储引擎时,这可能并不适用,只要我能验证,我很乐意标记为正确:您有此信息的来源或如何验证的示例?嗯,刚刚测试过。我在mongodb中启用了评测,并对一个类a进行了一次查询,该类B有3个
DBRef
字段。该查询返回4个a。在日志中,它在集合a中显示了1个查询,在集合B中显示了12个查询。您可以自己测试,很难将日志消息粘贴到注释中。此外,在spring boot starter data mongodb的日志记录中,它只显示了一个查询。这是一个很好的观点@Kroderia,但是这些引用不会自动填充。从文档中:驱动程序[1]不会自动将DBREF解析为文档。这意味着您仍然可以选择查询包含未解析引用的原始文档并保存这些请求。@kroderia,听起来您使用的抽象层/OOM生成了错误的查询。