MongoDB 文档关系

在 MongoDB 中,文档之间的关系可以通过嵌入和引用来建立。

嵌入文档关系(Embedded Documents)

将一个文档嵌入到另一个文档中。这种关系适用于具有强关联性的数据,其中一个文档是另一个文档的一部分。嵌入文档关系可以在单个文档中表示多个相关数据,提供了更好的性能和查询性能。例如:

{
   id: ObjectId('64fff377d892c5782e9712d7'),
   orderId: 1,
   orderDate: '2023-08-30 12:22:32',
   amount: 95.5,
   payment: {
       type: '银行卡',
       accountNumber: '账号...'
   }
}

上面文档中,一个订单包含了一个支付账号(payment)。

引用文档关系(Referenced Documents)

通过引用其他文档的 _id 字段来建立关系。这种关系适用于需要在多个文档之间共享数据的情况,可以通过引用来连接相关文档。引用文档关系提供了更好的数据一致性和灵活性,但需要进行额外的查询来获取关联数据。例如:

(1)订单文档

{
   id: ObjectId('64fff377d892c5782e9712d7'),
   orderId: 1,
   orderDate: '2023-08-30 12:22:32',
   amount: 95.5,
   address_id: '64fff60c02b5d747a406220e', // 引用地址文档ID
   products: [
       { id: 100, name: 'MongoDB权威指南', price: 20.5 },
       { id: 200, name: 'MongoDB入门指南', price: 31.5 },
       { id: 300, name: '精通MongoDB', price: 43.5 }
   ]
}

(2)地址信息

{
   _id: ObjectId('64fff60c02b5d747a406220e'),
   name: '常住地址',
   address: {
       street: '高新区天府二街',
       city: '成都市',
       state: '四川省',
       zip: '510000'
   }
}

以上实例中,订单文档的 address_id 字段包含地址信息 ObjectId。我们可以通过地址信息 ObjectId 来获取用户详细地址信息。

注意,该种方法需要经历两次查询:

(1)查询出订单中的地址信息ObjectId

(2)根据地址信息的 ObjectId 查询详细地址信息

DBRefs(Database References)

ngoDB 的 DBRefs(Database References)是一种标准化的引用文档的方式,用于在不同文档之间建立关联关系。

DBRefs 由以下三个字段组成:

  • $ref:引用的集合名称。

  • $id:引用文档的 _id 值。

  • $db(可选):引用文档所在的数据库名称。

使用 DBRefs 可以在不同的集合、数据库中建立关联关系,使得文档之间可以相互引用和查询。例如:

// User 文档
{
  "_id": ObjectId("65014c7af2c3f89c12e0c310"),
  "name": "John",
  "profile": {
     "$ref": "profiles",
     "$id": ObjectId("65014c309187ea83ac859b71"),
     "$db": "mydatabase"
  }
}

// Profile 文档
{
  "_id": ObjectId("65014c309187ea83ac859b71"),
  "email": "john@example.com",
  "phone": "123-456-7890"
}

执行上面语句后,输出如下:

test> db.profile.find()
[
 {
   _id: ObjectId("65014c309187ea83ac859b71"),
   email: 'john@example.com',
   phone: '123-456-7890'
 }
]

test> db.user.find()
[
 {
   _id: ObjectId("65014c7af2c3f89c12e0c310"),
   name: 'John',
   profile: DBRef("profiles", ObjectId("65014c309187ea83ac859b71"), "test")
 }
]

上面的示例中,User 文档通过 DBRefs 引用了 Profile 文档。$ref 字段指定了被引用的集合名称,$id 字段指定了被引用文档的 _id 值,$db 字段指定了被引用文档所在的数据库名称(可选)。

注意:DBRefs 只是一种约定,MongoDB 并不会自动处理 DBRefs 的引用关系,需要应用程序自行处理。在查询时,可以使用聚合管道的 $lookup 操作符来处理 DBRefs 的引用关系,或者在应用程序中手动解析和处理 DBRefs。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号