MongoDB教程11-MongoDB插入文档
这里将向大家介绍如何将数据插入到 MongoDB 的集合中。
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
文档是 MongoDB 中存储的基本单元,是一组有序的键值对集合。文档中存储的文档键的格式必须是符合 UTF-8 标准的字符串,同时要遵循以下注意事项:
- 不能包含
\0
字符(空字符),因为这个字符表示键的结束; - 不能包含
$
和.
,因为.
和$
是被保留的,只能在特定环境下使用; - 键名区分大小写;
- 键的值区分类型(如字符串和整数等);
- 键不能重复,在一条文档里起唯一的作用。
注意,以上所有命名规范必须符合 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 } ]);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)