【发布时间】:2014-02-06 09:37:08
【问题描述】:
我正在阅读 MongoDB 数据库参考文档中的 manual references 部分,但我并不真正理解“解析引用字段的第二个查询”的部分。你能给我一个这个查询的例子,这样我就可以更好地了解他们在说什么。
“手动引用是指将一个文档的 _id 字段包含在另一个文档中的做法。然后应用程序可以根据需要发出第二个查询来解析引用的字段。”
【问题讨论】:
标签: mongodb
我正在阅读 MongoDB 数据库参考文档中的 manual references 部分,但我并不真正理解“解析引用字段的第二个查询”的部分。你能给我一个这个查询的例子,这样我就可以更好地了解他们在说什么。
“手动引用是指将一个文档的 _id 字段包含在另一个文档中的做法。然后应用程序可以根据需要发出第二个查询来解析引用的字段。”
【问题讨论】:
标签: mongodb
您所指的手册部分中的文档非常清楚,即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 进行。在任何情况下,这种获取其他文档的操作都不会发生在服务器上。
【讨论】: