1. 孩子集合概述
在MongoDB中,集合(collection)是存储文档(document)的容器。类比于关系数据库中的表格(table),集合是MongoDB最基本的组成单位。
如果我们将集合看作关系数据库中的表格,那么孩子集合就相当于表格中的子表,即某个表格中数据的一个子集。孩子集合与父集合之间是通过ObjectId进行关联的,这在MongoDB中被称为嵌套的文档(nested document)。
2. 孩子集合的创建
2.1 创建集合
在MongoDB中,使用db.createCollection()方法即可创建集合。例如,下面的代码创建了一个名为students的集合:
db.createCollection("students");
执行后,MongoDB会返回一个JSON对象,其中包含了刚刚创建的集合的相关信息。例如,totalSize表示该集合的大小,ok表示操作是否成功等信息。
2.2 创建孩子集合
与创建普通集合类似,创建孩子集合需要借助db.createCollection()方法。但是在创建时,需要指定父集合名称以及嵌套字段名称。
例如,我们要创建一个名为addresses的孩子集合,它的父集合为students,嵌套字段名称为addresses。则可以使用下面的语句进行创建:
db.createCollection("students.addresses");
需要注意的是,这种方式创建的孩子集合不会单独存在于数据库中。如果父集合被删除,那么孩子集合也会随之被删除。
3. 孩子集合的操作
3.1 插入文档
向孩子集合中插入文档的方式与插入普通文档的方式类似,只需要在文档中指定嵌套字段的值即可。例如,向students集合中插入一个文档,其中的addresses值为一个嵌套文档数组:
db.students.insert({
name: "Alice",
age: 18,
addresses: [
{
address: "123 Main St.",
city: "San Francisco",
state: "CA"
},
{
address: "456 Oak St.",
city: "Los Angeles",
state: "CA"
}
]
});
上述代码将一个包含嵌套文档数组的文档插入到了students集合中。其中,嵌套文档数组的字段名称为addresses。
3.2 查询文档
查询孩子集合中的文档也需要注意嵌套字段。例如,如果要查询students集合中city字段为"San Francisco"的文档,则可以使用以下语句:
db.students.find({
"addresses.city": "San Francisco"
});
当我们使用嵌套字段进行查询时,MongoDB会以层级结构为基础进行匹配。在上述语句中,MongoDB会先查找documents下的所有文档,然后在每个文档中查找addresses数组,最终找到city等于"San Francisco"的文档。
3.3 更新文档
与查询文档类似,更新孩子集合中的文档也需要注意嵌套字段。例如,如果要将students集合中city字段为"San Francisco"的文档的state字段更新为"CA",则可以使用以下语句:
db.students.update(
{ "addresses.city": "San Francisco" },
{ $set: { "addresses.$.state": "CA" } }
);
在上述语句中,$表示匹配到的第一个文档,即city字段为"San Francisco"的文档。通过$set操作符,我们将其addresses数组中state字段的值更新为"CA"。
3.4 删除文档
删除孩子集合中的文档也不同于普通集合。为了删除嵌套文档数组中的某个元素,我们需要使用$pull操作符。例如,如果要删除students集合中addresses数组中city字段为"San Francisco"的嵌套文档,则可以使用以下语句:
db.students.update(
{},
{ $pull: { "addresses": { "city": "San Francisco" } } },
{ multi: true }
);
上述语句的第一个参数是一个空对象,表示我们要对students集合中的所有文档进行操作。通过$pull操作符,我们将addresses数组中city字段为"San Francisco"的元素删除。
4. 结论
本文介绍了MongoDB中孩子集合的概念、创建方法和操作方法,通过实例演示了插入、查询、更新和删除孩子集合中的文档的方法。孩子集合在MongoDB中是一种非常便捷的组织文档的方式,可以让我们更好地管理嵌套的关系数据。