MongoDB DBRefs:多表关联查询
7个月前 (04-27)
在《MongoDB关系》一节中,为了在 MongoDB 中实现规范化的数据库结构,我们使用了引用式关系(也称为手动引用)的概念,在手动引用中,我们需要将被引用文档的 _id 存储在其他文档中。当文档中需要引用来自不同数据的情况下,我们可以使用 MongoDB 中的 DBRefs。
当我们需要通过 users 来引用这些存有地址信息的时,需要根据地址类型来指定要查看的,在这种文档需要引用其它多个中文档的情况下,我们可以使用 DBRefs。
在下面示例的 users 文档中,address 字段就使用了 DBRefs:
下面通过一个具体的示例来演示 DBRefs 的使用:
DBRefs 与手动引用
假如有这样一个数据库,其中有一个 users ,用来存储用户信息,以及其它一些(例如 address_home、address_office、address_mailing 等),用来存储不同类型的地址数据。当我们需要通过 users 来引用这些存有地址信息的时,需要根据地址类型来指定要查看的,在这种文档需要引用其它多个中文档的情况下,我们可以使用 DBRefs。
使用 DBRefs
DBRef 的语法形式如下:{ $ref : value, $id : value, $db : value }
DBRefs 中有以下三个字段:$ref:此字段用来指定要引用文档所在的;
$id:此字段用来指定要引用文档的 _id 字段值;
$db:可选字段,用来指定要引用文档所在的数据库名称;
value:表示各个字段所对应的值。
在下面示例的 users 文档中,address 字段就使用了 DBRefs:
上面的 address 字段指定了引用的文档位于“bianchengbang”数据库下的“address_home”中,文档的 _id 值为 603c9355f2c28d0fdf74ae79。{
"_id" : ObjectId("603c93f2f2c28d0fdf74ae7b"),
"phone" : "",
"pincode" : "01-01-1991",
"name" : "bianchengbang",
"address": {
"$ref": "address_home",
"$id": ObjectId("603c9355f2c28d0fdf74ae79"),
"$db": "bianchengbang"
}
}
下面通过一个具体的示例来演示 DBRefs 的使用:
> var user = db.users.findOne({"name":"bianchengbang"})
> var dbRef = user.address
> db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
{
"_id" : ObjectId("603c9355f2c28d0fdf74ae79"),
"place" : "22 A, Indiana Apt",
"postcode" : 123456,
"city" : "Los Angeles",
"country" : "California"
}
上面的示例代码中 $ref 参数指定了的名称(本例中是 address_home),并在其中动态查找 _id 为 DBRef 中 $id 参数指定的文档。