在 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。