MongoDB 数据库引用学习笔记

1. 引用的概念

在 MongoDB 中,一个文档可以包含另一个文档的引用。这种引用类似于关系型数据库中的外键,它允许在不同文档之间建立关联关系。

2. 引用的使用

我们可以使用 $ref 属性来表示一个文档的引用。通常情况下,一个文档的引用都是另一个集合中的文档。下面是一个示例:

jsonCopy Code
{ "_id": 1, "name": "John", "friends": [ { "$ref": "users", "$id": 2 }, { "$ref": "users", "$id": 3 } ] }

上面的示例中,friends 字段是一个数组,它包含两个元素,每个元素都是一个文档的引用。在这个例子中,这两个文档都位于 users 集合中。

当我们需要获取引用文档的数据时,可以使用 $lookup 操作符进行查询。下面是一个简单的示例:

javascriptCopy Code
db.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 Code
db.users.insertMany([ { "_id": 1, "name": "John" }, { "_id": 2, "name": "Mary" }, { "_id": 3, "name": "Peter" } ])

articles 集合

javascriptCopy Code
db.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 Code
db.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" } ] } ]

从上面的查询结果中,我们可以看到每篇文章的作者信息都被正确地查询出来了。