MongoDB – 数据库参考
MongoDB – 数据库参考
正如 MongoDB 关系的最后一章所见,为了在 MongoDB 中实现规范化的数据库结构,我们使用了引用关系的概念,也称为手动引用,其中我们手动将引用文档的 id 存储在其他文档中。但是,如果文档包含来自不同集合的引用,我们可以使用MongoDB DBRefs。
DBRefs 与手动参考
作为一个示例场景,我们将使用 DBRefs 而不是手动引用,考虑一个数据库,我们将不同类型的地址(家庭、办公室、邮件等)存储在不同的集合(address_home、address_office、address_mailing 等)中。现在,当用户集合的文档引用地址时,它还需要根据地址类型指定要查看的集合。在文档引用来自多个集合的文档的这种情况下,我们应该使用 DBRefs。
使用 DBRefs
DBRefs 中有三个字段 –
-
$ref – 此字段指定引用文档的集合
-
$id – 此字段指定引用文档的 _id 字段
-
$db – 这是一个可选字段,包含引用文档所在的数据库的名称
考虑一个具有 DBRef 字段地址的示例用户文档,如代码片段所示 –
{ "_id":ObjectId("53402597d852426020000002"), "address": { "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "tutorialspoint"}, "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin" }
这里的地址DBRef字段指定引用的地址文档位于tutorialspoint数据库下的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" }