DBRef与手动引用
作为示例场景,在我们将使用DBRef代替手动引用的情况下,请考虑一个数据库,在该数据库中,我们将不同类型的地址(家庭,办公室,邮件等)存储在不同的集合中(address_home,address_office,address_mailing等)。现在,当用户集合的文档引用地址时,它还需要根据地址类型指定要查找的集合。在这种情况下,文档引用了许多的文档,我们应该使用DBRef。
使用DBRef
DBRefs中有三个字段-
- $ref - 该字段指定引用文档的集合
- $id - 此字段指定引用文档的_id字段
- $db - 这是一个可选字段,包含所引用文档所在的数据库的名称
考虑一个具有DBRef字段地址的示例用户文档,如代码片段所示-
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "jc2182"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
此处的 address DBRef字段指定所引用的address文档位于jc2182数据库下的address_home集合中,并且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"
}