引言 在处理数据库操作时,特别是在涉及到MongoDB这类NoSQL数据库时,常常会遇到需要批量更新或插入数据的场景。这种场景下,批量Upsert操作成为了一个非常实用的工具。...如果指定的数据已存在,则更新该数据;如果不存在,则插入新的数据。此外,MongoDB提供了$addToSet操作符,它用于向数组中添加元素,但仅当该元素尚不存在于数组中时才会添加,从而避免了重复。...本文将通过一个具体的示例,展示如何在MongoDB中高效地使用批量Upsert和$addToSet来处理数据。...实例 在MongoDB中,批量Upsert操作可以通过使用bulk_write方法配合upsert选项来实现。...在使用addToSet时, 完事, 周末快乐~ MongoDB的批量Upsert操作结合$addToSet操作符,为处理批量数据更新提供了一个既强大又灵活的解决方案。
类型别名仅在映射上下文知道实际类型时才有效。所需的实体元数据在第一次保存时确定,或者必须通过配置初始实体集提供。默认情况下,配置类会扫描基础包以寻找潜在的候选者。...插入和保存操作之间的区别在于,如果对象尚不存在,则保存操作会执行插入操作。 使用保存操作的简单情况是保存一个 POJO。在这种情况下,集合名称由类的名称(非完全限定)确定。...我的文档保存在哪个集合中? 有两种方法可以管理用于文档的集合名称。使用的默认集合名称是更改为以小写字母开头的类名称。所以一个com.test.Person类存储在person集合中。...().push("key").slice(5).each(Arrays.asList("Arya", "Arry", "Weasel")); // { $addToSet : { "values" :...11.5.6.在集合中查找和更新文档 该findAndModify(…)对方法MongoCollection可以更新的文件,并在单个操作中返回老任或新更新的文件。
与关系型数据库相比,MongoDB支持数组,将数组存储到文档之中。因此,与之对应的是数组的增删改查。对于有C语言基础的童鞋,数组应该不会陌生。数组的增删改查,在MongoDB中有相应的操作符来实现。...有关数组的查询可以参考:MongoDB 数组查询 1、占位符$ 占位符$的作用主要是用于返回数组中第一个匹配的数组元素值(子集),重点是第一个 在更新时未显示指定数组中元素位置的情形下,占位符$用于识别元素的位置...$addToSet不能保证添加时元素的顺序 如果为空,操作失败,如果添加的值是数组,那么整个值将作为一个单个元素被追加 > db.students.update...那么应用排序 如果指定了slice,那么切割数组 存储数组 示例: //字段不存在时的情形...结合$each,一次向数组push多个元素值,相同的元素值并没有忽略 > //这里是$push与$addToSet最大的一个差别,一个滤重,一个不滤重 > db.students.update
可以将分组后的某一个字段放到一个数组中,但是重复的元素将只出现一次,而且元素加入到数组中的顺序是无规律的,比如将分组后的每个城市的运费放到一个数组中,如下: db.sang_collect.aggregate...$push则对重复的数据不做限制,都可以添加进来,如下: db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$push:...其他操作符 $sort操作可以对文档进行排序,如下: db.sang_collect.aggregate({$sort:{orderAddressL:1}}) 用法和我们之前介绍普通搜索中的一致,可以按照存在的字段排序...总结 在管道开始执行的阶段尽可能过滤掉足够多的数据,这样做有两个好处:1.只有从集合中直接查询时才会使用索引,尽早执行过滤可以让索引发挥作用;2.该过滤的数据过滤掉之后,也可以降低后面管道的执行压力。...《MongoDB权威指南第2版》
参数option用于指定更新文档时的选项,它的可选值有upsert和multi。通过选项upsert可以指定该更新是否是upsert操作——它将告诉MongoDB,如果数据存在就更新,否则就创建数据。...通过$push操作符可以在指定字段中添加某个值。...如果该字段尚不存在,那么该字段的值将被设置为数组。如果该字段存在,但不是数组,那么将会抛出错误。...不过,只有数据不存在的时候,该操作符才能将数据添加到数组中。它的工作方式与$push不同。...执行原子操作时的标准行为是锁定数据,不允许其它查询访问,但MongoDB不支持锁或复杂的事务。MongoDB包含的几种更新操作都可以原子操作的方式更新数据: $set:设置特定值。
批量更新操作 默认情况下,当查询器查询出多条符合条件的数据时,默认修改第一条数据。那么如何实现批量修改? 语法: db....使用修改器来完成局部更新操作 4.1 $set修改器 $set修改器用来指定一个键值对,如果存在键就进行修改不存在则进行添加。...4.4 $push修改器 $push修改器用法: 1.如果指定的键是数组增追加新的数值 2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to...non-array 3.如果不存在指定的键则创建数组类型的键值对 4.此方法可添加重复数据 // 修改器名称:$push // 语法:{ $push : { field : value } } //...4.6 $addToSet修改器 $addToSet修改器是如果目标数组存在此项则不操作,不存在此项则加进去,即不添加重复数据。
当id存在的时候,如果要插入,则插入{'a': 'a'} 最后的参数true,则是指明,当update不存在的_id时,执行插入操作。默认是false,只更新,不插入。...$addToSet会判断集合是否需要排重,保证集合不重。$push可以对数组添加元素,但它只是直接插入数据,不做排重。...操作函数 可以把自己写的js代码保存在某个地方,让MongoDB加载它,然后就可以在MongoDB的命令行里操作它们。...,在之前没有排序就直接插入,耗时4小时多,现在,做了排序,插入只需要5分钟。...升级时,只在启动命令中添加:--storageEngine wiredTiger。
MongoDB在各方面的设计都旨在保持它的高性能,MongoDB能对文档进行动态填充(dynamic padding),也能预分配数据文件以利用额外的空间来换取稳定的性能。...这是为了使组织结构更清晰,这里的blog集合(这个集合甚至不需要存在)跟它的子集合没有任何关系。 在MongoDB中,使用子集合来组织数据非常高效,值得推荐。...local 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中 config MongoDB用于分片设置时,分片信息会存储在config数据库中。 ...(针对数组) -- 如果数组已经存在,$push 会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。...(针对数组) -- $addToSet添加值到一个数组中去,如果数组中已经存在该值那么将不会有任何的操作。
所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。 ---- 原子操作数据模型 考虑下面的例子,图书馆的书籍及结账信息。...实例说明了在一个相同的文档中如何确保嵌入字段关联原子操作(update:更新)的字段是同步的。...{ $inc : { field : value } } $push 用法: { $push : { field : value } } 把value追加到field里面去,field一定要是数组类型才行...,如果field不存在,会新增一个数组类型加进去。...{ $pull : { field : _value } } $addToSet 增加一个值到数组内,而且只有当这个值不在数组内才增加。
另外一个问题是更新时,MongoDB只会匹配第一个更新的文档,假设我的MongoDB中有如下数据: { "_id" : ObjectId("59f00d4a2844ff254a1b68f7"), "x"...MongoDB帮我把整个文档更新了!要解决这个问题,我们可以使用修改器。 $set修改器 $set可以用来修改一个字段的值,如果这个字段不存在,则创建它。如下: ?...$push可以向已有数组末尾追加元素,要是不存在就创建一个数组,还是以我们的上面的book为例,假设book有一个字段为comments,是一个数组,表示对这个book的评论,我们可以使用如下命令添加一条评论...: db.sang_collect.update({name:"三国演义"},{$push:{comments:"好书666"}}) 此时不存在comments字段,系统会自动帮我们创建该字段,结果如下...$addToSet 我们可以在插入的时候使用$addToSet,表示要插入的值如果存在则不插入,否则插入,如下: db.sang_collect.update({name:"三国演义"},{$addToSet
所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。----原子操作数据模型考虑下面的例子,图书馆的书籍及结账信息。...实例说明了在一个相同的文档中如何确保嵌入字段关联原子操作(update:更新)的字段是同步的。...{ $inc : { field : value } }$push用法:{ $push : { field : value } }把value追加到field里面去,field一定要是数组类型才行,如果...field不存在,会新增一个数组类型加进去。...{ $pull : { field : _value } }$addToSet增加一个值到数组内,而且只有当这个值不在数组内才增加。
MongoDB的安装 至此MongoDB安装完毕 启动MongoDB 将MongoDB的bin目录添加到path下 在C盘根目录下创建data文件夹,在data下创建db文件夹 打开CMD命令行窗口,...集合中存储的文档可以是各种各样的,没有格式要求 • 多个文档组成集合,多个集合组成数据库 创建数据库 • use 数据库名 – 使用use时,如果数据库存在则会进入到相应的数据库,如果不存在则会自动创建...– 可以将对象或数组中的对象添加进集合中 – 添加时如果集合或数据库不存在,会自动创建 – 插入的文档对象会默认添加_id属性,这个属性对应一个唯一的id,是文档的唯一标识 删除文档 • db.collection.remove...() – remove()可以用来移除指定文档对象 – 方法接收一个查询文档作为参数,只有符合条件的文档才会被删除 – 删除数据是永久的,不能撤销 • db.collection.drop()...• 我们将要学习以下几个修改器 – set、set、 set、unset 、inc、inc、inc、push、$addToSet $set $set用来指定一个字段的值,如果这个字段不存在,则创建它。
在插入文档时,MongoDB首先检查固定集合的size字段,然后检查max字段 1.1 使用默认集合 在MongoDB中,我们可以不用创建集合,当我们插入一些数据时,会自动创建集合,并且会使用文档管理命令中的集合名称作为集合的名称...我们使用这个day用户登录day数据库(最好把客户端关闭,在重新启动登录,否则可能会出现问题!),并向库中插入一条测试数据库 ? 查询集合 ?...在 day数据库中创建一个名为 day1 的集合,该集合创建时不指定任何参数。如果开启认证,则需要使用具有数据库管理员权限的用户来创建集合。 ?...可以发现,age字段已经不存在了。 2.1.2.4 $push 用法:{$push:{field:value}} 作用:把value追加到filed里面。...2.1.2.5 $addToSet 用法:{$addToSet:{field:value}} 作用:加一个值到数组内,而且只有当这个值不存在的时候数组才会添加进去 示例:往boy的别名字段里添加3
类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志 #4、文件存储 支持一种非常易用的协议,用于存储大文件和文件元数据。...#2、.和$有特别的意义,只有在特定环境下才能使用。 #3、以下划线"_"开头的键是保留的(不是严格要求的)。 2.2 集合就是一组文档。...有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。...db和mongod.log文件,自动创建服务 #3、注意bin路径下的配置文件mongod.cfg storage: dbPath: C:\Program Files\MongoDB\Server\...#2、自动生成_id 如果插入文档时没有"_id"键,系统会自帮你创建 一个。可以由MongoDb服务器来做这件事。 但通常会在客户端由驱动程序完成。
使用laod(),从交互式shell运行脚本 load("scipt.js") 在脚本中可以访问db变量,以及其他全局变量,然而shell辅助函数不可以在文件中使用 在shell中使用run...()执行命令行程序 run("ls","-l") 如果某些脚本被频繁加在,可以将他们添加到mongorc.js文件中,这个文件会在启动shell时自动运行 创建 更新 删除文档 插入并保存 使用...,如果数组的元素数量小鱼10(push之后),那么所有元素都会被保留,如果数组的元素大于10,那么只有最后10个元素会被保留。...,创建文档会将条件文档作为基础,然后对他应用修改器文档 save hello 帮助程序 save时一个shell函数,如果文档不存在,它会自动创建文档,如果文档存在,它就更新这个文档,它只有一个参数,文档...要是这个文档含有_id键,save会调用upsert,否在会调用insert 更新多个文档 默认情况下,更新只能对符合匹配条件的第一个文档执行操作,要是有多个文档符合条件,只有第一个文档会呗更新。
类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志 #4、文件存储 支持一种非常易用的协议,用于存储大文件和文件元数据。...#2、.和$有特别的意义,只有在特定环境下才能使用。 #3、以下划线"_"开头的键是保留的(不是严格要求的)。 2、集合就是一组文档。...有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 ...用于分片设置时,分片信息会存储在config数据库中 4、强调:把数据库名添加到集合名前,得到集合的完全限定名,即命名空间 例如: 如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是...三 安装 1、安装 #1、安装路径为D:\MongoDB,将D:\MongoDB\bin目录加入环境变量 #2、新建目录与文件 D:\MongoDB\data\db D:\MongoDB\log #3
2.5.4 MongoDB -- 更新和删除 整体更新 更新字段 字段操作 数组操作 删除 https://docs.mongodb.com/manual/reference/operator/update...) 字段操作 Name Description $currentDate 设置为当前时间 $inc 原子级增减操作 $min 当传入的值比数据库中的值小时才更新 $max 当传入的值比数据库中的值大时才更新...[index] 更新指定下标元素 $addToSet 添加元素到数组(当元素不存在于原来的数组当中) $pop 移除第一个或者最后一个元素 $pull 移除符合条件的数组元素 $pullAll 移除指定元素...更新指定下标元素 db.questions.updateOne({"tags": {$in: ["test2"]}}, {$set: {"tags.2": "c#"}}) // 添加元素到数组(当元素不存在于原来的数组当中...) db.questions.updateOne({"tags": {$in: ["test2"]}}, {$addToSet: {"tags": "c#"}}) // 移除第一个 db.questions.updateOne
一、插入\创建文档 --当插入一个不存在的文档时,会自动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecting to:...www.example.com", "pageviews" : 55, "visits" : 3 } 注意:可以看$set和$inc修改器的区别: $set是修改字符型的键值,$inc是修改数值型的键值;都是在不存在键时会自动添加上...$push $push作用:如果指定的键存在,$push会向已有数组末尾加入一个元素,要是没有就会创建一个新的数据。...$addToSet $addToSet作用:可以代替$ne和$push组全,在数组里加入一个元素且能加入多个元素,也能避免插入重复值 >db.users.findOne({"username":"licz...,存在时更新。
,在 mongodb 中基本的概念是文档、集合、数据库,下面我们详细介绍,下表将帮助您更容易理解 Mongo 中的一些概念: SQL 术语/概念 MongoDB 术语/概念 解释/说明 database...db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) $push 在结果文档中插入值到一个数组中...db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) $addToSet 在结果文档中插入值到一个数组中,...在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。...这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
领取专属 10元无门槛券
手把手带您无忧上云