我正在阅读MongoDB数据库参考文档中的manual references部分,但我并不真正理解解决引用字段的第二个查询部分"。你能给我一个这个问题的例子,这样我就可以更好地了解他们在谈论什么。
"手动引用是指在另一个文档中包含一个文档的_id字段的做法。然后,应用程序可以发出第二个查询以根据需要解析引用的字段。"
答案 0 :(得分:9)
在您所指的手册部分中,文档非常清楚,这是Database References中的部分。理解这一点最重要的部分包含在页面上的开头陈述中:
“MongoDB不支持连接。在MongoDB中,一些数据被非规范化,或者与文档中的相关数据一起存储以消除对连接的需要。但是,在某些情况下,将相关信息存储在单独的文档中是有意义的,通常是在不同的文档中集合或数据库。“
更多信息涵盖了可能如何选择处理您存储在其他集合中的数据的主题。
有DBRef规范,没有详细说明,可能在某些驱动程序中实现,以便在文档中找到它们时会自动检索(将引用的文档扩展到当前文档中。这将在“幕后”实现,并为该集合的另一个查询实现该_id的文档。
在Manual References的情况下,这基本上是说文档中只有一个字段,其中包含来自其他文档的 ObjectId 。这只与DBRef有所不同,因为基本驱动程序实现永远不会处理的事情就会让你处理对你的其他文档的进一步检索。
以下情况:
> db.collection.findOne()
{
_id: <ObjectId>,
name: "This",
something: "Else",
ref: <AnotherObjectId>
}
文档中的ref
字段只不过是一个简单的ObjectId,并没有什么特别之处。这允许您做的是提交您自己的查询以获取此引用的对象详细信息:
> db.othercollection.findOne({ _id: <AnotherObjectId > })
{
_id: <ObjectId>
name: "That"
something: "I am a sub-document to This!"
}
请记住,客户端上的所有这些进程都是通过驱动程序API实现的。在任何情况下,这些获取其他文档都不会发生在服务器上。