发布于 2015-07-10 16:15:14 | 341 次阅读 | 评论: 0 | 来源: 网络整理
正如在上一章的介绍MongoDB关系,来在MongoDB实现一个规范化的数据库结构 ,我们使用引用关系的概念,也被称为手动参考,我们在其中 手动存储其他文档引用文档的ID。然而,在一些情况下文档中包含来自不同的集合引用,我们可以使用MongoDB的DBRefs。
作 为一个示例场景,我们将使用DBRefs代替手动参考,考虑当我们要存储不同类型的地址(家庭,办公室,邮寄等)在不同的集合 (address_home,address_office,address_mailing等)的数据库。 现在,当用户集合文档引用地址,它也需要指 定哪个集合来寻找到基于所述地址类型。在这种情况下,如果一个文档要引用多个文档集合,我们应该使用DBRefs。
在DBRefs有三个字段:
$ref: 此字段指定引用文档的集合
$id: 此字段指定引用文档的_id字段
$db: 这是一个可选字段,包含数据库的名称,其中所引用的文档
请考虑示例用户文档有DBRef字段地址,如下图所示:
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "phperz"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
地址DBRef的字段在这里指定引用地址文档在address_home集合(在phperz数据库),并有一个ID: 534009e4d852427820000002.
下面的代码看起来动态的集合是通过$ref参数指定(address_home 在这个示例中) ID为一个文档由DBRef 的 $id 参数指定。
>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
上面的代码返回以下存在于地址文档的address_home集合:
{
"_id" : ObjectId("534009e4d852427820000002"),
"building" : "22 A, Indiana Apt",
"pincode" : 123456,
"city" : "Los Angeles",
"state" : "California"
}