📜  MongoDB-数据库参考

📅  最后修改于: 2020-11-27 06:01:08             🧑  作者: Mango


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

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": "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"
}