《MongoDB入门教程》第06篇 CRUD之创建文档
Posted 不剪发的Tony老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《MongoDB入门教程》第06篇 CRUD之创建文档相关的知识,希望对你有一定的参考价值。
本文开始将会介绍 MongoDB 中的基本 CRUD 操作,首先我们来学习一下如何创建文档。
使用 insertOne() 方法创建单个文档
集合的 insertOne() 方法可以用于创建单个文档。该方法的语法如下:
db.collection.insertOne(
<document>,
writeConcern: <document>
)
insertOne() 方法包含两个参数:
- document 是想要创建的文档内容,这是一个必选参数。
- writeConcern 是一个可选参数,用于指定插入操作结果的确认级别。我们会在后续教程中详细讨论该选项。
insertOne() 方法的返回结果包含以下字段信息:
- acknowledged,一个布尔值。如果插入文档时指定了安全写入(writeConcern),该字段的值为 true;如果禁用了安全写入机制,该字段的值为 false。
- insertedId,存储了文档的 _id 字段的值。
注意,如果集合不存在,insertOne() 方法同时会创建该集合并插入文档。
如果插入文档时没有指定 _id 字段,MongoDB 会自动增加该字段并产生一个唯一的 ObjectId。如果显式指定了 _id 字段的值,需要确保数据在集合内的唯一性。否则,MongoDB 将会返回一个重复键错误。
接下来我们看几个示例。
以下示例使用 nsertOne() 方法为集合 books 创建了一个新的文档,插入文档时没有指定 _id 字段:
db.books.insertOne(
title: 'MongoDB insertOne',
year: '2022'
);
输出结果如下:
"acknowledged" : true,
"insertedId" : ObjectId("621489fcf514a446bf1a98ea")
我们可以使用 find() 方法查询插入的文档:
db.books.find()
输出结果如下:
[
_id: ObjectId("621489fcf514a446bf1a98ea"),
title: 'MongoDB insertOne',
year: '2022'
]
接下来的示例在插入文档时指定了自定义的 _id 字段值:
db.books.insertOne(
_id: 1,
title: "Mastering Big Data",
year: "2022"
);
输出结果如下:
"acknowledged" : true, "insertedId" : 1
如果此时我们再插入一个文档,而且它的 _id 字段值也等于 1:
db.books.insertOne(
_id: 1,
title: "MongoDB for JS Developers",
year: "2021"
);
由于集合 books 中的 _id: 1 已经存在,MongoDB 将会返回以下错误:
WriteError(
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: bookstore.books index: _id_ dup key: _id: 1.0 ",
"op" :
"_id" : 1,
"title" : "MongoDB for JS Developers",
"year" : "2021"
)
使用 insertMany() 方法创建多个文档
insertMany() 方法可以一次插入多个文档,该方法的语法如下:
db.collection.insertMany(
[document1, document2, ...],
writeConcern: <document>,
ordered: <boolean>
)
insertMany() 方法包含两个参数。
第一个参数是一个文档数组,代表了需要插入的文档。
第二个参数是一个文档,包含了两个可选的字段。其中 writeConcern 指定写入操作的安全确认级别,ordered 用于指定是否需要按照顺序写入文档。
如果 ordered 设置为 true,MongoDB 将会按照第一个参数中的顺序写入文档,这是默认值。如果 ordered 设置为 false,MongoDB 可能会为了提高性能重新组织文档的顺序。
insertMany() 方法的返回结果包含了以下信息:
- 如果插入文档时指定了安全写入(writeConcern),acknowledged 字段的值为 true;如果禁用了安全写入机制,该字段的值为 false。
- 一个由文档 _id 字段的值组成的数组,代表了成功插入的文档。
注意,如果集合不存在,insertMany() 方法会创建该集合并插入文档。不过,只有插入操作成功时才会创建集合。
如果插入文档时没有指定 _id 字段,MongoDB 会自动增加该字段并产生一个唯一的 ObjectId。如果显式指定了 _id 字段的值,需要确保数据在集合内的唯一性。否则,MongoDB 将会返回一个重复键错误。
如果产生错误,insertMany() 会抛出一个 BulkWriteError 异常。此时,顺序插入操作会停止,但是无顺序插入操作会继续处理其他的文档。
以下语句使用 insertMany()方法一次插入多个文档,没有指定 _id 字段:
db.books.insertMany([
title: "NoSQL Distilled", year: "2020",
title: "NoSQL in 7 Days", year: "2019",
title: "NoSQL Database", year: "2018",
]);
输出结果如下:
acknowledged: true,
insertedIds:
'0': ObjectId("62148d16f514a446bf1a98f1"),
'1': ObjectId("62148d16f514a446bf1a98f2"),
'2': ObjectId("62148d16f514a446bf1a98f3")
以下语句使用自定义的 _id 字段插入多个文档:
db.books.insertMany([
_id: 1, title: "SQL Basics", year: "2021",
_id: 2, title: "SQL Advanced", year: "2022"
]);
输出结果如下:
acknowledged: true, insertedIds: '0': 1, '1': 2
下面的语句插入了已经存在的 _id 字段:
db.books.insertMany([
_id: 2, title: "SQL Performance Tuning", year: "2020",
_id: 3, title: "SQL Index", year: "2020"
]);
由于 _id: 2 已经存在,MongoDB 返回了以下错误:
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: bookdb.books index: _id_ dup key: _id: 2
Result: BulkWriteResult
result:
ok: 1,
writeErrors: [
WriteError
err:
index: 0,
code: 11000,
errmsg: 'E11000 duplicate key error collection: bookdb.books index: _id_ dup key: _id: 2 ',
errInfo: undefined,
op:
_id: 2,
title: 'SQL Performance Tuning',
year: '2020'
],
writeConcernErrors: [],
insertedIds: [ index: 0, _id: 2 , index: 1, _id: 3 ],
nInserted: 0,
nUpserted: 0,
nMatched: 0,
nModified: 0,
nRemoved: 0,
upserted: []
接下来的示例使用了无序插入方式:
db.books.insertMany(
[ _id: 3, title: "SQL Performance Tuning", year: "2020",
_id: 3, title: "SQL Trees", year: "2019",
_id: 4, title: "SQL Graph", year: "2021",
_id: 5, title: "NoSQL Pros", year: "2022"],
ordered: false
);
以上示例中的 _id: 3 是重复值,MongoDB 返回了错误。 不过,因为使用了无序插入, _id 为 4 和 5 的文档仍然能够插入集合中。以下语句返回了所有的文档:
db.books.find()
[
_id: ObjectId("62148d16f514a446bf1a98f1"),
title: 'NoSQL Distilled',
isbn: '0-4696-7030-4'
,
_id: ObjectId("62148d16f514a446bf1a98f2"),
title: 'NoSQL in 7 Days',
isbn: '0-4086-6859-8'
,
_id: ObjectId("62148d16f514a446bf1a98f3"),
title: 'NoSQL Database',
isbn: '0-2504-6932-4'
,
_id: 1, title: 'SQL Basics', year: '2021' ,
_id: 2, title: 'SQL Advanced', year: '2022' ,
_id: 3, title: 'SQL Performance Tuning', year: '2020' ,
_id: 4, title: 'SQL Graph', year: '2021' ,
_id: 5, title: 'NoSQL Pros', year: '2022'
]
以上是关于《MongoDB入门教程》第06篇 CRUD之创建文档的主要内容,如果未能解决你的问题,请参考以下文章