MongoDB 数据库引用学习笔记
1. 引用的概念
在 MongoDB 中,一个文档可以包含另一个文档的引用。这种引用类似于关系型数据库中的外键,它允许在不同文档之间建立关联关系。
2. 引用的使用
我们可以使用 $ref
属性来表示一个文档的引用。通常情况下,一个文档的引用都是另一个集合中的文档。下面是一个示例:
jsonCopy Code{
"_id": 1,
"name": "John",
"friends": [
{ "$ref": "users", "$id": 2 },
{ "$ref": "users", "$id": 3 }
]
}
上面的示例中,friends
字段是一个数组,它包含两个元素,每个元素都是一个文档的引用。在这个例子中,这两个文档都位于 users
集合中。
当我们需要获取引用文档的数据时,可以使用 $lookup
操作符进行查询。下面是一个简单的示例:
javascriptCopy Codedb.users.aggregate([
{
$lookup: {
from: "friends",
localField: "friends.$id",
foreignField: "_id",
as: "friendData"
}
}
]).pretty()
上面的查询操作会在 users
集合中查找所有文档,并将 friends
数组中每个元素的 $id
属性与 friends
集合中的 _id
进行匹配。如果匹配成功,就会返回对应引用文档的数据,并将它们放在 friendData
数组中。
3. 实例
假设我们有两个集合,一个是用户信息集合 users
,另一个是文章集合 articles
。每一篇文章都会包含一个作者字段,作者字段是一个文档的引用,指向 users
集合中的某个用户。下面是一个示例:
users
集合
javascriptCopy Codedb.users.insertMany([
{ "_id": 1, "name": "John" },
{ "_id": 2, "name": "Mary" },
{ "_id": 3, "name": "Peter" }
])
articles
集合
javascriptCopy Codedb.articles.insertMany([
{
"_id": 100,
"title": "MongoDB 数据库引用学习笔记",
"content": "这是一篇 MongoDB 数据库引用的学习笔记。",
"author": { "$ref": "users", "$id": 1 }
},
{
"_id": 101,
"title": "MongoDB 高级查询技巧",
"content": "这是一篇 MongoDB 高级查询技巧的学习笔记。",
"author": { "$ref": "users", "$id": 2 }
},
{
"_id": 102,
"title": "MongoDB 索引优化实战",
"content": "这是一篇 MongoDB 索引优化实战的学习笔记。",
"author": { "$ref": "users", "$id": 3 }
}
])
假设我们现在想要查询文章集合中的所有文章,以及它们各自的作者信息。我们可以使用以下代码进行查询:
javascriptCopy Codedb.articles.aggregate([
{
$lookup: {
from: "users",
localField: "author.$id",
foreignField: "_id",
as: "authorInfo"
}
}
]).pretty()
上面的查询操作会将 articles
集合中的每个文档的 author.$id
属性与 users
集合中的 _id
进行匹配,并返回相应的用户信息。最终的查询结果如下所示:
javascriptCopy Code[
{
"_id": 100,
"title": "MongoDB 数据库引用学习笔记",
"content": "这是一篇 MongoDB 数据库引用的学习笔记。",
"author": { "$ref": "users", "$id": 1 },
"authorInfo": [
{
"_id": 1,
"name": "John"
}
]
},
{
"_id": 101,
"title": "MongoDB 高级查询技巧",
"content": "这是一篇 MongoDB 高级查询技巧的学习笔记。",
"author": { "$ref": "users", "$id": 2 },
"authorInfo": [
{
"_id": 2,
"name": "Mary"
}
]
},
{
"_id": 102,
"title": "MongoDB 索引优化实战",
"content": "这是一篇 MongoDB 索引优化实战的学习笔记。",
"author": { "$ref": "users", "$id": 3 },
"authorInfo": [
{
"_id": 3,
"name": "Peter"
}
]
}
]
从上面的查询结果中,我们可以看到每篇文章的作者信息都被正确地查询出来了。