如mongodb关系的最后一章所示,要在mongodb中实现规范化的数据库结构,我们使用引用关系的概念,也称为手动引用,将引用的文档的id
手动存储在其他文档中。 但是,如果文档包含来自不同集合的引用,可以使用mongodb dbrefs。
考虑一个示例场景,在这个场景中将使用dbrefs而不是手动引用,设计有一个数据库中将不同类型的地址(家庭,办公室,邮件等)存储在不同的集合(address_home
,address_office
,address_mailing
等)中。 现在,当用户集合的文档引用地址时,还需要根据地址类型指定要查找的集合。 在这种情况下,文档引用了多个集合中的文档,则应该使用dbrefs。
dbrefs中有三个字段 -
$ref
- 此字段指定引用文档的集合$id
- 此字段指定引用文档的_id
字段$db
- 这是一个可选字段,并包含引用文档所在的数据库的名称假设一个具有dbref字段address
的示例用户文档,如代码片段所示 -
{
"_id":objectid("348362491fjaskdlf2314"),
"address": {
"$ref": "address_home",
"$id": objectid("sfaafdf4137832149fssa"),
"$db": "h3"},
"contact": "13800138000",
"dob": "1991-12-12",
"name": "maxsu"
}
这里的 dbref 字段 address
指定引用的地址文件位于h3
数据库中的address_home
集合中,其id为sfaafdf4137832149fssa
。
以下代码由$ref
参数(在示例中为address_home
)指定的集合中动态地查找id为dbref中的$id
参数指定的文档。
>var user = db.users.findone({"name":"maxsu"})
>var dbref = user.address
>db[dbref.$ref].findone({"_id":(dbref.$id)})
以上代码返回address_home
集合中存在的以下address
文档中 -
{
"_id" : objectid("sfaafdf4137832149fssa"),
"building" : "hainan apt no.2100",
"pincode" : 571100,
"city" : "haikou",
"province" : "hainan"
}