在 MongoDB 中,文档之间的关系可以通过嵌入和引用来建立。
将一个文档嵌入到另一个文档中。这种关系适用于具有强关联性的数据,其中一个文档是另一个文档的一部分。嵌入文档关系可以在单个文档中表示多个相关数据,提供了更好的性能和查询性能。例如:
{ id: ObjectId('64fff377d892c5782e9712d7'), orderId: 1, orderDate: '2023-08-30 12:22:32', amount: 95.5, payment: { type: '银行卡', accountNumber: '账号...' } }
上面文档中,一个订单包含了一个支付账号(payment)。
通过引用其他文档的 _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 查询详细地址信息
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。