《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之创建文档的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第06篇 CRUD之创建文档

《MongoDB入门教程》第14篇 CRUD之更新文档

《MongoDB入门教程》第14篇 CRUD之更新文档

《MongoDB入门教程》第07篇 CRUD之查找文档

《MongoDB入门教程》第07篇 CRUD之查找文档

《MongoDB入门教程》第21篇 CRUD之删除文档