首页 > 数据库 >MongoDB CRUD操作:批量写操作

MongoDB CRUD操作:批量写操作

时间:2024-06-01 22:03:55浏览次数:26  
标签:bulkWrite 批量 MongoDB CRUD 插入 分片 操作

MongoDB CRUD操作:批量写操作

文章目录


MongoDB提供了批量执行写入操作的能力,但批量写入操作只影响单个集合, MongoDB允许应用程序确定批量写入操作所需的可接受的确认级别。
db.collection.bulkWrite()方法支持批量插入、更新和删除的操作。当然,通过 db.collection.insertMany()方法也可以进行批量插入的操作。

关于批量操作的顺序

批量写入操作可以是有序的,也可以是无序的。通过操作的有序列表,MongoDB串行执行操作。如果在处理其中一个写操作期间发生错误,MongoDB 将返回,而不处理列表中任何剩余的写操作。

对于无序列表的操作,MongoDB可以并行执行操作,但不能保证这种行为。如果在处理其中一个写操作的过程中发生错误,MongoDB将继续处理列表中剩余的写操作。

在分片集合上执行有序操作列表通常会比执行无序列表慢,因为使用有序列表时,每个操作都必须等待前一个操作完成。

默认情况下,bulkWrite()执行有序操作,如果要指定无序写入操作,可以选项文档中设置ordered: false

bulkWrite()支持的方法

bulkWrite()支持下面的写操作:

  • insertOne
  • updateOne
  • updateMany
  • replaceOne
  • deleteOne
  • deleteMany

所有的写操作都作为数组中的文档传递给bulkWrite()

举例

使用下面的脚本创建pizzas集合:

db.pizzas.insertMany( [
   { _id: 0, type: "pepperoni", size: "small", price: 4 },
   { _id: 1, type: "cheese", size: "medium", price: 7 },
   { _id: 2, type: "vegan", size: "large", price: 8 }
] )

下面的bulkWrite()示例在pizzas集合上运行:

  • 使用insertOne添加两个文档
  • 使用updateOne更新一个文档
  • 使用deleteOne删除一个文档
  • 使用replaceOne替换一个文档
try {
   db.pizzas.bulkWrite( [
      { insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },
      { insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } } },
      { updateOne: {
         filter: { type: "cheese" },
         update: { $set: { price: 8 } }
      } },
      { deleteOne: { filter: { type: "pepperoni"} } },
      { replaceOne: {
         filter: { type: "vegan" },
         replacement: { type: "tofu", size: "small", price: 4 }
      } }
   ] )
} catch( error ) {
   print( error )
}

执行完成后输出已完成操作的摘要信息:

{
   acknowledged: true,
   insertedCount: 2,
   insertedIds: { '0': 3, '1': 4 },
   matchedCount: 2,
   modifiedCount: 2,
   deletedCount: 1,
   upsertedCount: 0,
   upsertedIds: {}
}

向分片集合批量插入的策略

大量插入操作(包括初始数据插入或常规数据导入)可能会影响分片集群的性能。对于批量插入,可考虑以下策略:

预分割集合

如果分片集合为空,则该集合只有一个初始块,该块驻留在单个分片上,MongoDB必须花时间接收数据、创建拆分并将拆分块分发到可用分片。为了避免这种性能成本,可以预先拆分集合。

无序写入 mongos

要提高分片集群的写入性能,可以使用bulkWrite()``,并将可选参数ordered设置为false。 mongos可以尝试同时将写入发送到多个分片。对于空集合,首先按照分片集群中的分割块中的描述预先分割集合。

避免单调节流

如果分片键在插入期间单调增加,则所有插入的数据都会到达集合中的最后一个块,该块将始终位于单个分片上。因此,集群的插入容量永远不会超过单个分片的插入容量。

如果插入量大于单个分片可以处理的量,并且无法避免单调递增的分片键,则建议对应用程序进行以下修改:

  • 反转片键的二进制位。这保留了信息并避免将插入顺序与递增的值序列相关联。
  • 交换第一个和最后一个 16 位字以“随机”插入。

以下示例采用 C++ 语言,交换生成的 BSON ObjectId 的前导和尾随 16 位字,以便它们不再单调递增。

using namespace mongo;
OID make_an_id() {
  OID x = OID::gen();
  const unsigned char *p = x.getData();
  swap( (unsigned short&) p[0], (unsigned short&) p[10] );
  return x;
}

void foo() {
  // 创建一个对象
  BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" );
}

标签:bulkWrite,批量,MongoDB,CRUD,插入,分片,操作
From: https://blog.csdn.net/superatom01/article/details/139380356

相关文章

  • 【Redis】 使用Java操作Redis的客户端
    文章目录......
  • PowerShell 来操作 Windows 防火墙,实现网络访问控制和防火墙规则的设置。下面是一些常
    PowerShell来操作Windows防火墙,实现网络访问控制和防火墙规则的设置。下面是一些常见的PowerShell命令,用于创建阻止特定类型文件传输协议的规则和限制电子邮件附件的规则:阻止FTP传输协议:powershellCopyCodeNew-NetFirewallRule-DisplayName"BlockFTP"-DirectionOu......
  • 2024最新西瓜视频收益玩法,一台电脑即可 新手小白简单操作单号月入1800+
    在数字时代的浪潮中,短视频领域成为了一个巨大的流量池。抖音,无疑站在了这股浪潮的顶端,吸引了无数的观众和创作者。然而,对于初出茅庐的新手来说,要想在抖音中脱颖而出,并非易事。很多时候,成功似乎和运气有着千丝万缕的联系,这让许多新手感到无从下手。幸运的是,随着视频号的......
  • MySQL基础操作
    1)cmd进入mysql控制台:mysql-uroot-p1234root为用户名,1234为密码或mysql-uroot-p1234或把密码换一行输入:mysql-uroot-p或mysql-uroot-p然后提示输入密码2)退出数据库控制台exit和quit3)查看所有数据库;showdatabases;4)显示时间selectnow(......
  • cocos creator 3.x实现手机虚拟操作杆
    ​简介在许多移动游戏中,虚拟操纵杆是一个重要的用户界面元素,用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆,提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆,如固定和跟随,以及如何在实际游戏中使用这些操纵杆。unity2022版本实现虚拟操作杆可......
  • C语言--CH06--操作符(下)
    C语言–CH06–操作符(下)四、赋值操作符1、赋值和初始化的区别赋值和初始化有显著的区别inta=10;//这是初始化a=20;//这是赋值2、连续赋值赋值是一种从左往右的运算,并且可以连续赋值:inta=0;intb=10;intc=20;a=b=c+1;printf("%d\n",a);猜......
  • C语言--CH05--操作符(上)
    C语言–CH05–操作符(上)一、算术操作符+-*/%操作规则:1、%的操作数只能为整数。2、/的操作数中只要有一个浮点数,运算结果就为浮点数。3、除了%以外的操作符的操作数都可以不是整数。4、%10即取个位数,%100即取个位十位数,以此类推。5、整数/整数,结果向下取整......
  • C语言文件操作指南:读写与管理
    在C语言编程中,文件操作是一个重要的主题。无论是读取配置文件、记录日志,还是处理大量数据,文件操作都是必不可少的。本文将介绍C语言中文件操作的基本概念和常用方法,帮助你轻松掌握这项技能。一、文件操作的基本概念在C语言中,文件操作主要包括以下几步:打开文件:创建一个文件指......
  • 通过Restful接口实现对数据库进行基本的读写操作
    一、创建springboot项目这里使用的springboot项目与我们上次使用的一样,所以创建方法跟下文一致即可。SpringBoot+MySQL的简单运用(HelloWorldAPI)-CSDN博客二、配置数据库连接2.1创建数据库首先我们要创建一个数据库,应用于本次项目。打开MySQL,输入密码登录。(MySQL安......
  • 3G/4G无线视频监控系统在吊车操作中的应用
    引言随着科技的快速发展,无线视频监控技术在多个领域得到了广泛应用。在吊车操作中,3G/4G无线视频监控系统以其高效、实时的特性,为操作人员提供了更全面的视觉信息,从而大大提高了操作的安全性。本文将详细介绍3G/4G无线视频监控系统的组成、工作原理及其在吊车操作中的应用。一......