开发学院

您的位置:首页>教程>正文

教程正文

MongoDB 数据库引用

MongoDB 数据库引用

  如上一章所示,为了在MongoDB中实现规范化的数据库结构,我们使用了引用关系的概念,也称为手动引用,其中我们手动将引用文档的id存储在其他文档中。但是,如果文档包含来自不同集合的引用,则可以使用MongoDB DBRefs。

DBRefsvs手动引用

  作为一个使用DBRefs而不是手动引用的示例场景,请考虑存储不同类型地址(家庭、办公室、邮件等)的数据库。)在不同的集合(地址_家庭、地址_办公室、地址_邮件等)中。现在,当用户集合的文档引用地址时,它还需要根据地址类型指定要查找的集合。在文档引用许多集合中的文档的情况下,我们应该使用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为535009d 8521942000002。

  下面的代码在$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"

}