写点什么

三、创建、更新和删除文档

用户头像
Kylin
关注
发布于: 2021 年 02 月 23 日
三、创建、更新和删除文档

3.1 插入并保存文档

可以使用 insert 方法向目标集合插入一个文档:

> db.table.insert({"name":"this is my name"})WriteResult({ "nInserted" : 1 })>
复制代码


3.1.1 批量插入

在 shell 中,可以使用 insertMany 函数实现批量插入,它接受一个文档数组作为参数:

> db.mydb.insertMany([{"key1":"value1","key2":"value2"},{"key1":"value3"},{"key2":"value4"}]){        "acknowledged" : true,        "insertedIds" : [                ObjectId("6033d499a645f64a043ff03c"),                ObjectId("6033d499a645f64a043ff03d"),                ObjectId("6033d499a645f64a043ff03e")        ]}>>>>> db.mydb.find(){ "_id" : 0 }{ "_id" : 1 }{ "_id" : ObjectId("6033d499a645f64a043ff03c"), "key1" : "value1", "key2" : "value2" }{ "_id" : ObjectId("6033d499a645f64a043ff03d"), "key1" : "value3" }{ "_id" : ObjectId("6033d499a645f64a043ff03e"), "key2" : "value4" }>
复制代码


一次发送数十、数百乃至数千个文档会明显提高插入的速度。



只有需要将多个文档插入到一个集合时,这种方式才会有用。不能在单次请求中将多个文档批量插入到多个集合中。



如果在执行批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入到集合中,而这个文档以及之后的所有文档全部插入失败。

>>> db.mydb.insertMany([{"k1":"v1","k2":"v2","_id":2},{"k1":"v1","_id":2},{"k2":"v2"}])2021-02-23T00:06:20.219+0800 E  QUERY    [js] uncaught exception: BulkWriteError({        "writeErrors" : [                {                        "index" : 1,                        "code" : 11000,                        "errmsg" : "E11000 duplicate key error collection: test.mydb index: _id_ dup key: { _id: 2.0 }",                        "op" : {                                "k1" : "v1",                                "_id" : 2                        }                }        ],        "writeConcernErrors" : [ ],        "nInserted" : 1,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]}) :BulkWriteError({        "writeErrors" : [                {                        "index" : 1,                        "code" : 11000,                        "errmsg" : "E11000 duplicate key error collection: test.mydb index: _id_ dup key: { _id: 2.0 }",                        "op" : {                                "k1" : "v1",                                "_id" : 2                        }                }        ],        "writeConcernErrors" : [ ],        "nInserted" : 1,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]})BulkWriteError@src/mongo/shell/bulk_api.js:367:48BulkWriteResult/this.toError@src/mongo/shell/bulk_api.js:332:24Bulk/this.execute@src/mongo/shell/bulk_api.js:1186:23DBCollection.prototype.insertMany@src/mongo/shell/crud_api.js:326:5@(shell):1:1>>>>>> db.mydb.find(){ "_id" : 0 }{ "_id" : 1 }{ "_id" : ObjectId("6033d499a645f64a043ff03c"), "key1" : "value1", "key2" : "value2" }{ "_id" : ObjectId("6033d499a645f64a043ff03d"), "key1" : "value3" }{ "_id" : ObjectId("6033d499a645f64a043ff03e"), "key2" : "value4" }{ "_id" : 2, "k1" : "v1", "k2" : "v2" }>>>>
复制代码


在批量插入中遇到错误时,可以使用 continueOnError 选项让 insertMany 忽略错误并且继续执行后续插入。shell 并不支持这个选项,但是所有驱动程序都支持


3.1.2 插入校验

  • 检查文档的基本结构,如果没有“_id”字段,就自动增加一个。

  • 所有文档都必须小于 16MB


主流语言的所有驱动程序(以及大部分其他语言的驱动程序),都会在将数据插入到数据库之前做大量的数据校验(比如文档是否过大,文档是否包含非 UTF-8 字符串,是否使用不可识别的类型)。


3.2 删除文档


用户头像

Kylin

关注

现实的理想主义者 2019.10.08 加入

【坐标】:魔都 【品种】:程序媛 【标签】:技术宅、大吃货 【追求】:改变世界、改变自己 【信条】:每次前进一小步

评论

发布
暂无评论
三、创建、更新和删除文档