我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mongoose之bulkWrite操作使用实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mongoose之bulkWrite操作使用实例

前言

在执行mongo操作时,有时候大家会觉得力不从心,比如:要给大量的数据更新,但是各个数据更新的内容不一样;需要批量创建大量数据; 以上操作,如果单纯使用findIOneAndUpdate或者save,首先是非常耗时、其次使用了大量的资源;

那么有没有什么好的方法去替代呢?

mongoose提供了bulkWrite批量操作防范,这个方法支持批量插入、更新和删除;

当然,不会有人以为批量操作就不能单独操作一条数据吧!

一: bulkWrite小小解释

mongoose关于bulkWrite的原文:mongoosejs.com/docs/api.ht…

操作语法:

db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
   {
      writeConcern : <document>,
      ordered : <boolean>
   }
)
参数类型是否必填描述
operationsarray必填bulkWrite() 写操作的数组。支持操作:insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne
writeConcerndocument选填write concern 文档,省略则使用默认的 write concern,一般无用
orderedboolean选填表示mongod实例有序还是无序执行操作。默认值true。

关于ordered

  • 如果为true,有序执行,按顺序执行并在第一个错误处停止,遇到错误就停止执行后续的operations操作(后续的操作不会被执行)
  • 如果为false,无序执行,为并行执行,如果遇到错误,会继续执行在一个操作,直到所有操作成功或出错;

综上所述,个人建议使用时配置为无序执行;各位可以按需求使用,后续会具体说明各项操作及返回值

二:具体操作

insertOne

插入单个文档到集合中;

db.collection.bulkWrite( [
   { insertOne : { "document" : {} } },
  { insertOne : { "document" : {} } }
] ,{ordered:fasle})
db.collection.bulkWrite( [
   { insertOne : { "document" : {} } },
  { insertOne : { "document" : {} } }
])

字段说明

  • insertOne.document:需要插入的文档信息,如果文档不包含_id,则会自动生成;
  • ordered:选填,有序还是无序执行;

updateOne

updateOne 更新集合中 filter 匹配的单个文档。如果匹配到多个文档 updateOne 仅更新第一个匹配到的文档;

db.collection.bulkWrite( [
   { updateOne :
      {
         "filter" : {name:"bulkWrite6"},
         "update" : {$set:{age:19}},
         "upsert" :true
      }
   }
],{ordered:fasle} )
db.collection.bulkWrite( [
   { updateOne :
      {
         "filter" : {name:"bulkWrite6"},
         "update" : {$set:{age:19}},,
         "upsert" :true
      }
   }
] )

字段说明

  • updateOne.filter:object,必填,匹配条件;
  • updateOne.update:object,必填,更新内容,可执行操作为:set、 set 、set、 unset 、$rename等等;
  • updateOne.upsert: boolean, 选填,默认为false,如果为true,则没有匹配时插入一个新文档;

updateMany

updateMany 更新集合中所有匹配到的文档;

db.collection.bulkWrite( [
   { updateMany :
      {
         "filter" : {name:"bulkWrite6"},
         "update" : {$set:{age:19}},
         "upsert" :true
      }
   }
],{ordered:fasle} )
db.collection.bulkWrite( [
   { updateMany :
      {
         "filter" : {name:"bulkWrite6"},
         "update" : {$set:{age:19}},,
         "upsert" :true
      }
   }
] )

字段说明

  • updateOne.filter:object,必填,匹配条件;
  • updateOne.update:object,必填,更新内容,可执行操作为:set、 set 、set、 unset 、$rename等等;
  • updateOne.upsert: boolean, 选填,默认为false,如果为true,则插入一个文档filter

deleteOne

deleteOne 删除集合中 filter 匹配到的单个文档。如果匹配到多个文档 deleteOne 只会删除一个匹配到的文档;

db.collection.bulkWrite([
   { deleteOne :  { "filter" : {age:19} } }
] )

字段说明

  • deleteOne.filter:object,必填,删除与此过滤器匹配的第一个文档;

deleteMany

deleteMany 删除集合中 filter 匹配到的所有文档;

db.collection.bulkWrite([
   { deleteMany :  { "filter" : {age:19} } }
] )

字段说明

  • deleteMany.filter:object,必填,删除与此过滤器匹配的所有文档;

replaceOne

replaceOne 替换集合中 filter 匹配到的单个文档。如果匹配到多个文档 replaceOne 只会替换一个匹配到的文档;

db.collection.bulkWrite([
   { replaceOne :
      {
         "filter" :{age:19},
         "replacement" : {age:20},
         "upsert" :true
      }
   }
] )

字段说明

  • updateOne.filter:object,必填,替换与此过滤器匹配的第一个文档;
  • updateOne.update:object,必填,替换内容;
  • updateOne.upsert: boolean, 选填,默认为false,如果为true,如果没有匹配的文档,则插入一个文档filter

三:优点

  • 可以批量同时执行不同的操作,新增、修改、删除;
  • 执行速率比save、findOneAndUpdate等等快,因为,bulkWrite是在一个命令中向 MongoDB 服务器发送多个insertOne、updateOne、updateMany、replaceOne、 deleteOne等等的请求,这比发送多个独立操作更快,因为bulkWrite()只有一次往返 MongoDB,而每一次独立操作都是一次往返的MongoDB。

四:以下需要注意

  • ordered参数,由于bulkWrite中可以几个操作同时混合使用,那么,如果使用无序执行时,可能会造成deleteOne或deleteMany 删除的文档可能会变多或变少,具体取决于deleteOne或deleteMany 是在insertOne,updateOne,updateMany或replaceOne操作之前或之后的运行。

如下:

db.collection.bulkWrite(
   [
      { insertOne : <document> },
      { updateOne : <document> },
      { updateMany : <document> },
      { replaceOne : <document> },
      { deleteOne : <document> },
      { deleteMany : <document> }
   ],
   { ordered : false }
)
  • 更新(updateOne、updateMany)或替换(replaceOne)操作不能指定与原始文档不同的 _id 值;

五:错误返回

错误返回值主要分为两种,ordered的有序和无序执行的错误返回, 以下述插入为例,第一项、第四项和第五项是不存在的,第二项和第三项的_id是已存在的

有序执行错误

db.collection.bulkWrite(
  [
    {
      insertOne: { document: { name: 'bulkWrite10' } }
    },
    {
      insertOne: { document: { _id: '6321a77b06e79133d99b926c', name: 'bulkWrite6' } }
    },
    {
      insertOne: { document: { _id: '63227cde0795b55523c0e8ac', name: 'bulkWrite7' } }
    },
    {
      insertOne: { document: { name: 'bulkWrite11' } }
    },
    {
      insertOne: { document: { name: 'bulkWrite12' } }
    }
  ],
  { ordered: true }
);

有序执行错误,返回值中只有一个错误的,但是insertedIds中index=2、3、4都没有执行

{
        "code": 11000,
        "writeErrors": [
            {
                "code": 11000,
                "index": 1,
                "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                "op": {
                    "name": "bulkWrite6",
                    "age": 0,
                    "register_time": "2022-09-15T03:45:04.529Z",
                    "remark": null,
                    "vip": false,
                    "address": null,
                    "_id": "6321a77b06e79133d99b926c"
                }
            }
        ],
        "result": {
            "ok": 1,
            "writeErrors": [
                {
                    "code": 11000,
                    "index": 1,
                    "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                    "op": {
                        "name": "bulkWrite6",
                        "age": 0,
                        "register_time": "2022-09-15T03:45:04.529Z",
                        "remark": null,
                        "vip": false,
                        "address": null,
                        "_id": "6321a77b06e79133d99b926c"
                    }
                }
            ],
            "writeConcernErrors": [],
            "insertedIds": [
                {
                    "index": 0,
                    "_id": "63229fc8afcdaac9bd268102"
                },
                {
                    "index": 1,
                    "_id": "6321a77b06e79133d99b926c"
                },
                {
                    "index": 2,
                    "_id": "63227cde0795b55523c0e8ac"
                },
                {
                    "index": 3,
                    "_id": "63229fc8afcdaac9bd268105"
                },
                {
                    "index": 4,
                    "_id": "63229fc8afcdaac9bd268106"
                }
            ],
            "nInserted": 1,
            "nUpserted": 0,
            "nMatched": 0,
            "nModified": 0,
            "nRemoved": 0,
            "upserted": []
        }
    }

无序执行错误

db.collection.bulkWrite(
  [
    {
      insertOne: { document: { name: 'bulkWrite10' } }
    },
    {
      insertOne: { document: { _id: '6321a77b06e79133d99b926c', name: 'bulkWrite6' } }
    },
    {
      insertOne: { document: { _id: '63227cde0795b55523c0e8ac', name: 'bulkWrite7' } }
    },
    {
      insertOne: { document: { name: 'bulkWrite11' } }
    },
    {
      insertOne: { document: { name: 'bulkWrite12' } }
    }
  ],
  { ordered: false }
);

无序执行错误,返回值中有两个报错,三个插入成功

{
        "code": 11000,
        "writeErrors": [
            {
                "code": 11000,
                "index": 1,
                "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                "op": {
                    "name": "bulkWrite6",
                    "age": 0,
                    "register_time": "2022-09-15T03:47:51.976Z",
                    "remark": null,
                    "vip": false,
                    "address": null,
                    "_id": "6321a77b06e79133d99b926c"
                }
            },
            {
                "code": 11000,
                "index": 2,
                "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('63227cde0795b55523c0e8ac') }",
                "op": {
                    "name": "bulkWrite7",
                    "age": 0,
                    "register_time": "2022-09-15T03:47:51.976Z",
                    "remark": null,
                    "vip": false,
                    "address": null,
                    "_id": "63227cde0795b55523c0e8ac"
                }
            }
        ],
        "result": {
            "ok": 1,
            "writeErrors": [
                {
                    "code": 11000,
                    "index": 1,
                    "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('6321a77b06e79133d99b926c') }",
                    "op": {
                        "name": "bulkWrite6",
                        "age": 0,
                        "register_time": "2022-09-15T03:47:51.976Z",
                        "remark": null,
                        "vip": false,
                        "address": null,
                        "_id": "6321a77b06e79133d99b926c"
                    }
                },
                {
                    "code": 11000,
                    "index": 2,
                    "errmsg": "E11000 duplicate key error collection: test_one.users index: _id_ dup key: { _id: ObjectId('63227cde0795b55523c0e8ac') }",
                    "op": {
                        "name": "bulkWrite7",
                        "age": 0,
                        "register_time": "2022-09-15T03:47:51.976Z",
                        "remark": null,
                        "vip": false,
                        "address": null,
                        "_id": "63227cde0795b55523c0e8ac"
                    }
                }
            ],
            "writeConcernErrors": [],
            "insertedIds": [
                {
                    "index": 0,
                    "_id": "6322a06b9145a56d3b23fabe"
                },
                {
                    "index": 1,
                    "_id": "6321a77b06e79133d99b926c"
                },
                {
                    "index": 2,
                    "_id": "63227cde0795b55523c0e8ac"
                },
                {
                    "index": 3,
                    "_id": "6322a06b9145a56d3b23fac1"
                },
                {
                    "index": 4,
                    "_id": "6322a06b9145a56d3b23fac2"
                }
            ],
            "nInserted": 3,
            "nUpserted": 0,
            "nMatched": 0,
            "nModified": 0,
            "nRemoved": 0,
            "upserted": []
        }
    }

六:思考

个人经常使用bulkWrite的场景是:

  • 定时更新数据,比如更新人员基本信息,因为每个人更新的内容都不相同;
  • 刷数据,有些数据需要删除、有些需要更新、有些需要新增;

bulkWrite是比save、update更为高级的写法,希望大家可以灵活运用。

引用

mongoose关于bulkWrite的原文:mongoosejs.com/docs/api.ht…

以上就是mongoose之bulkWrite操作使用实例的详细内容,更多关于mongoose bulkWrite操作的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mongoose之bulkWrite操作使用实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js中使用mongoose操作mongodb数据库的方法

如何利用mongoose将数据写入mongodb数据库? 1.利用npm下载安装mongoose;npm install mongoose2.建立js文件,引入mongoosevar mongoose = require('mongoose
2022-06-04

怎么在NestJs中使用Mongoose对MongoDB进行操作

这篇文章主要介绍了怎么在NestJs中使用Mongoose对MongoDB进行操作,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!首先是安装所需依赖npm install --save @nestjs/m
2023-06-06

安装使用Mongoose配合Node.js操作MongoDB的基础教程

安装mongoose 使用express准备一个TestMongoDB项目,命令序列如下:express TestMongoDB cd TestMongoDB npm install执行完上面的命令后,使用下面的命令安装mongoose:n
2022-06-04

python开发之文件操作用法实例

本文实例讲述了python开发之文件操作用法。分享给大家供大家参考,具体如下: 先来看看官方API:os-Miscellaneous operating system interfaces 下面是我做的demo:import re impo
2022-06-04

Node.js中使用mongoskin操作mongoDB实例

一、废话 从13年1月份接触mongodb进行开发,开发了旅游标签服务、微博标签检索系统、地图服务、web APP服务...使用MongoDB的场景从.NET、JAVA环境转到了node.js平台。越发觉Node.js和mongodb结合感
2022-06-04

使用EF操作Docker中的Mysql实例

为啥我会选择mysql呢?因为我的服务器配置较低,而SqlServer在docker中的实例,服务器的运行内存应当保持在2G+,我没有这个条件,它会爆出这样的错误 sqlservr: This program requires a machine with a
使用EF操作Docker中的Mysql实例
2019-06-29

JavaWeb使用POI操作Excel文件实例

1.为项目添加POIPOI官网链接点进去之后下载(上边的是编译好的类,下边的是源代码) 解压文件夹,把下面三个文件复制到WebComtent>WEB-INF>lib文件夹下再把这三个文件复制到Tomcat的lib文件夹下,否则Tomcat会
2023-05-31

使用itextpdf操作pdf的实例讲解

使用maven引入jar com.itextpdf itextpdf 5.2.0
2023-05-30

python开发之list操作实例分析

本文实例分析了python开发之list操作。分享给大家供大家参考,具体如下: 对python中list的操作,大家可以参考《Python list操作用法总结》 以下是我个人的笔记:#python list '''创建list有很多方法:
2022-06-04

js的实用操作之removeAttribute

removeAttribute是JavaScript中的一个实用操作,用于从一个HTML元素中移除指定的属性。语法:element.removeAttribute(attributeName)参数说明:- attributeName:要移除
2023-09-28

C语言操作符使用实例分析

本篇内容介绍了“C语言操作符使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!算术操作符主要是 (+ - * / %) 五种算数操作
2023-07-02

Kotlin惰性集合操作之Sequence序列使用示例

这篇文章主要为大家介绍了Kotlin惰性集合操作之Sequence序列使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-03

Android开发之时间日期操作实例

相信对于手机的时间日期设置大家一定都不陌生吧,今天举一个关于时间日期设置的示例,其中有些许不完善之处,例如如何使设置的时间日期和手机系统同步等。感兴趣的读者可以根据自身经验加以完善。 现来看看具体示例,希望对大家有所帮助。 首先是时间设置:
2022-06-06

mysql数据表的基本操作之表结构操作,字段操作实例分析

本文实例讲述了mysql数据表的基本操作之表结构操作,字段操作。分享给大家供大家参考,具体如下: 本节介绍: 表结构操作创建数据表、查看数据表和查看字段、修改数据表结构删除数据表字段操作新增字段、修改字段数据类型、位置或属性、重命名字段删除
2022-05-11

使用Python对Csv文件操作实例代码

csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格:就可以存储为csv文件,文件内容是:No.,Name,Age,Score 1,mayi,18,99 2,jack,21,89 3,t
2022-06-04

python开发之for循环操作实例详解

本文实例讲述了python开发之for循环操作。分享给大家供大家参考,具体如下: 下面是我做的一些学习记录供大家参考:#基本的for循环语句 test_list = [2,"Jone",3,6,7,'hongten','hanyuan','
2022-06-04

编程热搜

目录