位置:首页 > 数据库 > MongoDB在线教程 > MongoDB关系

MongoDB关系

MongoDB中的关系代表文件如何在各种逻辑上彼此相关。关系可以通过嵌入和引用的方法来模拟。这样的关系可以是 1:1, 1: N, N: 1 或 N: N.

让我们考虑存储用户地址的情况(例子)。这样,一个用户可以有多个地址,那么就成为一个 1:N 的关系。

下面是用户文件的示例文档的结构:

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

下面是地址文件的示例文档结构:

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
} 

嵌入建模关系

在嵌入式方法中,我们将嵌入地址文件到用户文档中。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
} 

这种方法保持在一个单一的文件,它可以很容易地检索和维护所有相关数据。 整份文件,可检索这样一个查询:

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

需要注意上面的查询,db和用户分别代表数据库和集合。

缺点是,如果嵌入的文档不断增长过大,这会影响到读/写性能。

模型引用关系

这是设计标准化关系的方法。在这种方法中,用户和地址的文件将被分别维护,但用户文档将包含的字段将引用地址文档的id字段。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
} 

如上图所示,用户文档包含数组字段address_ids,它包含相应地址的ObjectID。使用这些的ObjectID,我们可以查询地址文档,并从中获得地址的详细信息。通过这种方法,我们将需要两个查询:首先来从用户文档取出address_ids字段,再次从地址集合获取这些地址。

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})