1. MongoDB概述
MongoDB是一种高性能、开源、面向文档的NoSQL数据库,采用C++语言编写。它广泛应用于现代Web应用程序和大数据应用。相比传统的关系型数据库,MongoDB的优势在于:
可以快速存储、索引和查询海量数据。
具有卓越的水平可扩展性,能够在多台服务器间实现分布式存储和处理。
支持各种数据模型,包括文档、图形、键值、列簇等。
具有灵活的结构和数据访问方式,能够有效处理半结构化数据和非结构化数据。
支持多种语言和平台,包括Java、Python、Node.js、.NET、JavaScript等。
2. 添加新数据
在MongoDB中,新数据的添加是通过向集合(Collection)中插入文档(Document)来实现的。集合是一些文档的容器,类似于关系型数据库中的表。文档则是MongoDB中的基本数据单元,类似于关系型数据库中的行。
2.1 插入单个文档
如果要向集合中插入一个文档,可以使用insertOne()方法。该方法的基本语法如下:
db.collection.insertOne(
{<document>}
);
其中,<document>是要插入的文档对象,可以是JavaScript对象或JSON对象。例如,以下代码向students集合中插入一个名为"Tom"的学生:
db.students.insertOne(
{name: "Tom", age: 18, gender: "Male", major: "Computer Science"}
);
在上面的代码中,插入的文档包含四个属性:name、age、gender和major。其中,name属性的值为"Tom",age属性的值为18,gender属性的值为"Male",major属性的值为"Computer Science"。
执行该代码后,在students集合中会新增一条文档记录。可以使用find()方法查询该集合,如下所示:
db.students.find();
该方法会返回students集合中的所有文档,输出结果如下:
{
"_id": ObjectId("60e5597cac8a3f5d314df107"),
"name": "Tom",
"age": 18,
"gender": "Male",
"major": "Computer Science"
}
其中,"_id"属性是MongoDB自动生成的唯一标识符,用于标识文档在集合中的位置。
2.2 插入多个文档
如果要向集合中插入多个文档,可以使用insertMany()方法。该方法的基本语法如下:
db.collection.insertMany(
[<document1>, <document2>, ..., <documentN>]
);
其中,[<document1>, <document2>, ..., <documentN>]是一个由多个文档组成的数组。例如,以下代码向students集合中插入三个学生:
db.students.insertMany([
{name: "Alice", age: 20, gender: "Female", major: "Mathematics"},
{name: "Bob", age: 19, gender: "Male", major: "Physics"},
{name: "Cindy", age: 21, gender: "Female", major: "Chemistry"}
]);
执行该代码后,在students集合中会新增三条文档记录。可以使用find()方法查询该集合,如下所示:
db.students.find();
该方法会返回students集合中的所有文档,输出结果如下:
{
"_id": ObjectId("60e5597cac8a3f5d314df107"),
"name": "Tom",
"age": 18,
"gender": "Male",
"major": "Computer Science"
},
{
"_id": ObjectId("60e55b29ac8a3f5d314df108"),
"name": "Alice",
"age": 20,
"gender": "Female",
"major": "Mathematics"
},
{
"_id": ObjectId("60e55b29ac8a3f5d314df109"),
"name": "Bob",
"age": 19,
"gender": "Male",
"major": "Physics"
},
{
"_id": ObjectId("60e55b29ac8a3f5d314df10a"),
"name": "Cindy",
"age": 21,
"gender": "Female",
"major": "Chemistry"
}
2.3 插入包含数组的文档
如果要向集合中插入包含数组的文档,可以将数组写为一个属性的形式,然后像插入普通文档一样插入即可。例如,以下代码向students集合中插入一个名为"David"的学生,其中hobbies属性包含了多个元素:
db.students.insertOne(
{
name: "David",
age: 22,
gender: "Male",
major: "English",
hobbies: ["Reading", "Writing", "Traveling"]
}
);
执行该代码后,使用find()方法查询该集合,可以看到新增的文档记录:
{
"_id": ObjectId("60e55d62ac8a3f5d314df10b"),
"name": "David",
"age": 22,
"gender": "Male",
"major": "English",
"hobbies": ["Reading", "Writing", "Traveling"]
}
在上面的代码中,hobbies属性是一个数组,其元素分别为"Reading"、"Writing"和"Traveling"。
2.4 插入包含嵌套文档的文档
如果要向集合中插入包含嵌套文档的文档,可以将嵌套文档写为一个属性的形式,然后像插入普通文档一样插入即可。例如,以下代码向students集合中插入一个名为"Emily"的学生,其中address属性是一个嵌套文档:
db.students.insertOne(
{
name: "Emily",
age: 23,
gender: "Female",
major: "Biology",
address: {
city: "New York",
street: "Broadway",
zipcode: "10001"
}
}
);
执行该代码后,使用find()方法查询该集合,可以看到新增的文档记录:
{
"_id": ObjectId("60e55f32ac8a3f5d314df10c"),
"name": "Emily",
"age": 23,
"gender": "Female",
"major": "Biology",
"address": {
"city": "New York",
"street": "Broadway",
"zipcode": "10001"
}
}
在上面的代码中,address属性是一个嵌套文档,其属性分别为city、street和zipcode。
2.5 插入自定义_id
如果要插入自定义_id的文档,可以在文档中显式指定_id属性的值。例如,以下代码向students集合中插入一个名为"Frank"的学生,并显式指定_id属性的值:
db.students.insertOne(
{
_id: 1002,
name: "Frank",
age: 24,
gender: "Male",
major: "History"
}
);
执行该代码后,在students集合中会新增一条文档记录。可以使用find()方法查询该集合,如下所示:
db.students.find();
该方法会返回students集合中的所有文档,输出结果如下:
{
"_id": ObjectId("60e5597cac8a3f5d314df107"),
"name": "Tom",
"age": 18,
"gender": "Male",
"major": "Computer Science"
},
{
"_id": ObjectId("60e55b29ac8a3f5d314df108"),
"name": "Alice",
"age": 20,
"gender": "Female",
"major": "Mathematics"
},
{
"_id": ObjectId("60e55b29ac8a3f5d314df109"),
"name": "Bob",
"age": 19,
"gender": "Male",
"major": "Physics"
},
{
"_id": ObjectId("60e55b29ac8a3f5d314df10a"),
"name": "Cindy",
"age": 21,
"gender": "Female",
"major": "Chemistry"
},
{
"_id": 1002,
"name": "Frank",
"age": 24,
"gender": "Male",
"major": "History"
}
在上面的代码中,新增的文档的_id属性的值为1002,而不是MongoDB自动生成的ObjectId。
2.6 错误处理
MongoDB在插入文档时,可能会出现一些错误。其中,最常见的错误是重复插入。例如,如果尝试向students集合中插入一个_id属性已经存在的文档,则会出现以下错误:
db.students.insertOne(
{
_id: 1002,
name: "George",
age: 25,
gender: "Male",
major: "Political Science"
}
);
WriteError({
"index": 0,
"code": 11000,
"errmsg": "E11000 duplicate key error collection: test.students index: _id_ dup key: { _id: 1002 }",
"op": {
"_id": 1002,
"name": "George",
"age": 25,
"gender": "Male",
"major": "Political Science"
}
})
在上面的代码中,插入的文档的_id属性的值为1002,与之前插入的文档重复了。
为了避免错误,可以在插入文档时设置唯一索引,或者使用upsert选项。唯一索引可以保证插入的文档中_id属性的唯一性,而upsert选项可以在插入文档时判断_id属性是否存在,如果不存在则插入文档,否则更新文档。
3. 结论
本文介绍了在MongoDB中添加新数据的技巧,包括插入单个文档、插入多个文档、插入包含数组的文档、插入包含嵌套文档的文档、插入自定义_id、错误处理等。MongoDB具有卓越的性能和灵活性,适用于现代Web应用程序和大数据应用。我们希望这篇文章能帮助您更好地理解MongoDB的基本操作。