MongoDB教程11-MongoDB插入文档

这里将向大家介绍如何将数据插入到 MongoDB 的集合中。

文档的数据结构和 JSON 基本一样。

所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

文档是 MongoDB 中存储的基本单元,是一组有序的键值对集合。文档中存储的文档键的格式必须是符合 UTF-8 标准的字符串,同时要遵循以下注意事项:

  • 不能包含字符(空字符),因为这个字符表示键的结束;
  • 不能包含$.,因为.$是被保留的,只能在特定环境下使用;
  • 键名区分大小写;
  • 键的值区分类型(如字符串和整数等);
  • 键不能重复,在一条文档里起唯一的作用。

注意,以上所有命名规范必须符合 UTF-8 标准的字符串,文档的键值对是有顺序的,相同的键值对如果有不同顺序,也是不同的文档。

例1:以下两组文档是不同的,因为值的类型不同。

{"recommend":"5"}
{"recommend":5}

例2:以下两组文档也是不同的,因为键名是区分大小写的。

{"Recommend":"5"}
{"recommend":"5"}

例3:以下两组文档也是不同的,因为键值对有不同顺序。

{"name":"tom", "age":10}
{"age":10, "name":"tom"}

MongoDB 插入文档

要将数据插入 MongoDB 集合中,可以使用 MongoDB 的 insert() 方法,同时 MongoDB 针对插入一条还是多条数据,提供了更可靠的 insertOne() 和 insertMany() 方法。

MongoDB 向集合里插入记录时,无须事先对数据存储结构进行定义。如果待插入的集合不存在,则插入操作会默认创建集合。

在 MongoDB 中,插入操作以单个集合为目标,MongoDB 中的所有写入操作都是单个文档级别的原子操作。

向集合中插入数据的语法如下:

db.collection.insert(
<document or array of documents>,
{
    writeConcern: <document>,    //可选字段
    ordered: <boolean>    //可选字段
    }
)

collection 为集合名,insert() 为插入文档命令

参数说明:

  • <document or array of documents> 参数表示可设置插入一条或多条文档。
  • writeConcern:<document> 参数表示自定义写出错的级别,是一种出错捕捉机制, 默认为 1,即要求确认写操作,0 是不要求。
  • ordered:<boolean> 是可选的,默认为 true。
    • 如果为 true,在数组中执行文档的有序插入,并且如果其中一个文档发生错误,MongoDB 将返回而不处理数组中的其余文档;
    • 如果为 false,则执行无序插入,若其中一个文档发生错误,则忽略错误,继续处理数组中的其余文档。

插入不指定 _id 字段的文档的代码如下:

> db.myColl3.insert({"title":"MongoDB教程",    // 命令没结束, 回车可以换行
... "info":"MongoDB 是一个 Nosql 数据库"
... })
WriteResult({ "nInserted" : 1 })

myColl3集合如果不存在,自动创建并插入文档...

在插入期间,mongod 将创建 _id 字段并为其分配唯一的 Objectld 值,这里的 mongod 是一个 MongoDB 服务器的实例,也就是 MongoDB 服务驻扎在计算机上的进程。

查看集合文档的代码如下:

> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }

这些 Objectld 值与执行时操作时的机器和时间有关,因此,用户执行这段命令后的返回值与示例中的值是不同的。

插入指定 _id 字段的文档,值 _id 必须在集合中唯一,以避免重复键错误,代码如下:

> db.myColl3.insert({    // 命令没结束, 回车换行
... "_id":1,
... "title":"insert指定_id",
... "info":"MongoDB插入数据"
... })
WriteResult({ "nInserted" : 1 })
> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
{ "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }

可以看到新插入文档的 id 值为设置的 id 值1。如果插入指定_id重复, 如下:

> db.myColl3.insert({
... "_id":1
... })
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: myDB.myColl3 index: _id_ dup key: { _id: 1.0 }"
        }
})

插入的多个文档无须具有相同的字段。例如,下面代码中的第一个文档包含一个 _id 字段和一个 type 字段,第二个和第三个文档不包含 _id 字段。因此,在插入过程中,MongoDB 将会为第二个和第三个文档创建默认 _id 字段,代码如下:

> db.myColl3.insert([  // 一次插入多个文档, 使用[{},{}...]的格式
... {"_id":2, "name":"张三", "age":18, "address":"中国"},
... {"name":"李四", "age":19},
... {"info":"Hello", "car":"buick"}
... ])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 3,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

查询验证,可以看到在 _id 插入期间,系统自动为第二、第三个文档创建了字段,代码如下:

> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
{ "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }
{ "_id" : 2, "name" : "张三", "age" : 18, "address" : "中国" }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }

注意插入多条数据使用[{}, {}...]的格式

我们也可以将数据定义为一个变量,如下所示:

> document=({"name":"test", "age":66})
{ "name" : "test", "age" : 66 }
>
> db.myColl3.insert(document)
WriteResult({ "nInserted" : 1 })
>
> db.myColl3.find()
{ "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
{ "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }
{ "_id" : 2, "name" : "张三", "age" : 18, "address" : "中国" }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
{ "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }
{ "_id" : ObjectId("5f4f510ae8b8099c8e7dbecc"), "name" : "test", "age" : 66 }  // document变量定义的数据

有序地插入多条文档的代码如下:

> db.myColl3.insert([
        {_id:10, item:"pen", price:"20" },
        {_id:12, item:"redpen", price: "30" },
        {_id:11, item:"bluepen", price: "40" }
    ],
    {ordered:true}
)

在设置 ordered:true 时,插入的数据是有序的,如果存在某条待插入文档和集合的某文档 _id 相同的情况,_id 相同的文档与后续文档都将不再插入。在设置 ordered:false 时,除了出错记录(包括 _id 重复)外其他的记录继续插入。

MongoDB 3.2 更新后新增以下两种新的文档插入命令如下:

db.collection.insertone ()
db.collection.insertMany()

使用 insertOne() 插入一条文档的代码如下:

db.myColl.iusertone( { item: "card", qty: 15 } );

使用 insertMany() 插入多条文档的代码如下:

db.myColl.insertMany([
    { item: "card", qty: 15 },
    { item: "envelope", qty: 20 },
    { item: "stamps", qty:30 }
]);
原文地址:https://www.cnblogs.com/no-celery/p/13602240.html