千家信息网

Mongodb的Bulk Write 操作

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,本文来自与自己的博客:www.wangerbao.comBulk Write Operations操作是mongodb3.2的新增功能,语法如下:db.collection.bulkWrite(
千家信息网最后更新 2025年01月25日Mongodb的Bulk Write 操作

本文来自与自己的博客:www.wangerbao.com

Bulk Write Operations操作是mongodb3.2的新增功能,语法如下:

db.collection.bulkWrite(   [ , , ... ],   {      writeConcern : ,      ordered :    })

其中ordered是个需要注意的地方,根据官方描述:

  1. 默认是ture,也就是按照顺序插入数据,如果中间出现错误则不会在继续执行

  2. 如果是false,则mongo会采用并发的方式插入数据,中间出现错误对后续操作无影响

事例如下

  • 初始化数据,初始化3条

  • > db.log.count();0> db.log.bulkWrite( [...     { insertOne : { "document" : {"_id" : 1, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } },...     { insertOne : { "document" : {"_id" : 2, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } },...     { insertOne : { "document" : {"_id" : 3, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } }...     ],{ordered:true});{        "acknowledged" : true,        "deletedCount" : 0,        "insertedCount" : 3,        "matchedCount" : 0,        "upsertedCount" : 0,        "insertedIds" : {                "0" : 1,                "1" : 2,                "2" : 3        },        "upsertedIds" : {        }}> db.log.count();3
  • order默认:true,第二条数据主键冲突,则只会插入第一条数据,数据总量为4

  • 第二条数据主键冲突,则只会插入一条数据> db.log.bulkWrite( [...     { insertOne : { "document" : {"_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } },...     { insertOne : { "document" : {"_id" : 2, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } },...     { insertOne : { "document" : {"_id" : 5, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } }...     ],{ordered:true});2017-04-10T17:48:37.960+0800 E QUERY    [thread1] BulkWriteError: write error at item 1 in bulk operation :BulkWriteError({        "writeErrors" : [                {                        "index" : 1,                        "code" : 11000,                        "errmsg" : "E11000 duplicate key error collection: c_log.log index: _id_ dup key: { : 2.0 }",                        "op" : {                                "_id" : 2,                                "char" : "Dithras",                                "class" : "barbarian",                                "lvl" : 4                        }                }        ],        "writeConcernErrors" : [ ],        "nInserted" : 1,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]})BulkWriteError@src/mongo/shell/bulk_api.js:372:48BulkWriteResult/this.toError@src/mongo/shell/bulk_api.js:336:24Bulk/this.execute@src/mongo/shell/bulk_api.js:1173:1DBCollection.prototype.bulkWrite@src/mongo/shell/crud_api.js:191:20@(shell):1:1> db.log.count();4
  • order修改为false,第一条数据主键冲突,2、3条没问题,则数据总量为6

  • > db.log.bulkWrite( [...     { insertOne : { "document" : {"_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } },...     { insertOne : { "document" : {"_id" : 6, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } },...     { insertOne : { "document" : {"_id" : 5, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } }...     ],{ordered:false});2017-04-10T17:49:36.539+0800 E QUERY    [thread1] BulkWriteError: write error at item 0 in bulk operation :BulkWriteError({        "writeErrors" : [                {                        "index" : 0,                        "code" : 11000,                        "errmsg" : "E11000 duplicate key error collection: c_log.log index: _id_ dup key: { : 4.0 }",                        "op" : {                                "_id" : 4,                                "char" : "Dithras",                                "class" : "barbarian",                                "lvl" : 4                        }                }        ],        "writeConcernErrors" : [ ],        "nInserted" : 2,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]})BulkWriteError@src/mongo/shell/bulk_api.js:372:48BulkWriteResult/this.toError@src/mongo/shell/bulk_api.js:336:24Bulk/this.execute@src/mongo/shell/bulk_api.js:1173:1DBCollection.prototype.bulkWrite@src/mongo/shell/crud_api.js:191:20@(shell):1:1> db.log.count();6


0