位置:首页 > 数据库 > MongoDB在线教程 > MongoDB数据库引用

MongoDB数据库引用

正如在上一章的介绍MongoDB关系,来在MongoDB实现一个规范化的数据库结构 ,我们使用引用关系的概念,也被称为手动参考,我们在其中手动存储其他文档引用文档的ID。然而,在一些情况下文档中包含来自不同的集合引用,我们可以使用MongoDB的DBRefs。

DBREFS VS 手动参考

作为一个示例场景,我们将使用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": "yiibai"},
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

地址DBRef的字段在这里指定引用地址文档在address_home集合(在yiibai数据库),并有一个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"
}