mongoDB 文档操作_改

mongoDB 更改操作

格式对比 MySQL

update table set .... where ....
db.collection.updateOne(query,update,upsert)

修改函数

updateOne  修改首个

db.collection.updateOne(query,update,upsert)

功能  修改第一个复合条件的文档

参数

            query   筛选条件,用法同 find
            update  要修改的数据项, 配合修改操作符
            upsert  bool类型
                        设置为 true    未查到则插入新文档
                        设置为 false   默认是 false, 未查到则不修改

 

实例

将 aa 的年龄修改为 19 岁
    > db.class.updateOne({name:"aa"},{$set:{age:19}})
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
未添加 upsert 为 true 时, 无匹配, 因此没变化 > db.class.updateOne({name:"ww"},{$set:{age:19}}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
设置 upsert 为 true 时, 无匹配则会插入新文档 > db.class.updateOne({name:"ww"},{$set:{age:19}},{upsert:true}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5c779dbbe0253ec903878cd0")

updateMany  修改所有

db.collection.updateMany(query,update,upsert)

功能  修改所有符合条件的文档

参数  同 updateOne

实例

将所有年龄 小于18 的修改为 21
    > db.class.updateMany({age:{$lt:18}},{$set:{age:21}})
    { "acknowledged" : true, "matchedCount" : 6, "modifiedCount" : 6 }
    >

update  修改所有

db.collection.update(query,update,upsert,multi)

功能  修改文档

参数

query   用法同 updateOne/updateMany
update   用法同 updateOne/updateMany
upsert 功能同 updateOne/updateMany
写法上不在写在 {} 中, 直接 upsert=true/false 即可

multi   bool 值 multi=false 同 updateOne 只修改首条 默认为 false multi=true 同 updateMany 修改全部

ps:

  mongoDB 全部的参数都位置传参,如果想传第四个,就必须传入第三个参数

实例

> db.class.update({age:21},{$set:{age:88}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

upsert 使用的时候,直接写 bool 即可
    > db.class.update({name:"yy"},{$set:{age:88}},true)
    WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1,
        "nModified" : 0,
        "_id" : ObjectId("5c77a57ee0253ec903878d10")
    })

multi 使用同 upsert, 直接写 bool 即可
    > db.class.update({age:21},{$set:{age:88}},true,true)
    WriteResult({ "nMatched" : 5, "nUpserted" : 0, "nModified" : 5 })
    >

findOneAndUpdate  查找首个并修改

db.collection.findOneAndUpdate(query,update)

功能  查找第一个复合条件文档, 然后修改

参数  query update 用法同 updateOne/updateMany

返回值 修改前的文档

实例

查找名字 叫 cc 文档, 修改年龄为 26 
> db.class.findOneAndUpdate({name:"cc"},{$set:{age:26}}) { "_id" : ObjectId("5c77910c4b2b9d43636830ca"), "name" : "cc", "age" : 88, "sex" : "b", "hobby" : [ "python", "football", "computer" ] }

findOneAndReplace  查找首个并替换

db.collection.findOneAndReplace(query,doc)

功能  查找第一个复合条件文档, 然后替换

参数

  query   用法同 updateOne/updateMany

  doc     要替换的文档

返回值 修改前的文档

查找 名字 叫 cc 的文档, 将内容替换成 名字叫 zz 年龄 16 岁
> db.class.findOneAndReplace({name:"cc"},{name:"zz",age:16}) { "_id" : ObjectId("5c77910c4b2b9d43636830ca"), "name" : "cc", "age" : 26, "sex" : "b", "hobby" : [ "python", "football", "computer" ] }
如果 query 设置为空,则可以对第一条内容进行替换
    > db.class.findOneAndReplace({},{name:"kk",age:16})
    {
        "_id" : ObjectId("5c7790c94b2b9d43636830c8"),
        "name" : "aa",
        "age" : 19,
        "sex" : "b",
        "hobby" : [
            "draw",
            "dance",
            "running"
        ]
    }

mongoDB 修改操作符(修改器)

修改的时候必须要使用修改器

如果用较老的 update 方法 确实可以不使用修改器, 但是实现效果是替换很不理想

本意想 查找 名字 yy 的文档,将 age 改为 99 
> db.class.update({name:"yy"},{age:99}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "yy", "age" : 88 }
修改后: { "age" : 99 }

$set

修改一个域, 或者增加一个域

查找 age 为 99 的文档, 将名字 改为 yy
> db.class.update({age:99},{$set:{name:"yy"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前:{ "age" : 99}
修改后:{ "age" : 99, "name" : "yy" }

$unset

删除一个域

ps:

官方推荐 选定被删除域的时候值用 "" 空即可,当前其实随便字符都行,重点是匹配域, 而不是值

去除掉 年龄 99 的文档中的 age 域
> db.class.update({age:99},{$unset:{age:""}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" : 99, "name" : "yy" } 修改后: { "age" : 99}

$rename

重命名一个域

将所有的含有 sex 域的文档的 sex 域 改名为 gender 
> db.class.updateMany({sex:{$exists:true}},{$rename:{sex:"gender"}}) { "acknowledged" : true, "matchedCount" : 6, "modifiedCount" : 6 }

其实也不用刻意的去筛选, 系统会自动对存在该域的文档进行处理, 所以直接  {}  即可

> db.class.updateMany({},{$rename:{gender:"sex"}})
{ "acknowledged" : true, "matchedCount" : 10, "modifiedCount" : 6 }

$inc

加法修改器

让所有文档的 年龄 +1 
> db.class.updateMany({},{$inc:{age:1}}) { "acknowledged" : true, "matchedCount" : 10, "modifiedCount" : 10 }
修改前:  { "name" : "yy" }
修改后:  { "name" : "yy", "age" : 1 }

ps:

  值可以是正数,负数或者小数

  么有年龄字段的会产生 age:1 字段

$mul

乘法修改器

用法,参数同加法,只是运算由加法换成乘法

ps:

  怎么除法? *0.5 = /2

$setOnInsert

当使用 update*  插入文档时 ,作为 补充 内容

update* 在筛选无法命中存在文档时可以添加新内容,但是插入内容是全面 query update 部分

当需要加入 额外字段 的时候, 使用此修改器

查找 name 为 77 age 为 15 的文档(查不到), 设置内容为 eat 域 的值为 many ,并且 额外加入 run 域 值为 fast 
> db.class.updateOne({name:"77",age:15},{$set:{eat:"many"},$setOnInsert:{run:"fast"}},{upsert:true}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5c788dbce0253ec903878dba") } >

ps:

  由此可见其实 update 的第二个参数 update 是可以多个修改器同时使用的

查找 名字 为 77 的文档, 将将 名字 改为 22 , 并且 去除 eat 域
> db.class.update({name:"77"},{$set:{age:22},$unset:{eat:""}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" : 15, "name" : "77", "eat" : "many", "run" : "fast" } 修改后: { "age" : 22, "name" : "77", "run" : "fast" }

$max

指定值不低于下限

指定某个域的值如果小于该值则修改为该值, 大于则不变

指定 name 为 77 的文档的 age 域 的值 不能小于 20 
> db.class.update({name:"77"},{$max:{age:20}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
修改前: { "age" : 22, "name" : "77", "run" : "fast" } 修改后: { "age" : 22, "name" : "77", "run" : "fast" }
指定 name 为 77 的文档 的 age 域 的值 不能小于 30
> db.class.update({name:"77"},{$max:{age:30}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" : 22, "name" : "77", "run" : "fast" } 修改后: { "age" : 30, "name" : "77", "run" : "fast" }

$min

指定值不低于上限

用法同 $max 控制最大值不超过设定值,大于了就改成设定值

mongoDB 数组修改器

$push

向数组中添加一项

查找 name 为 dd 的文档, 将 hobby 域内的数组 增加一项 sing
> db.class.update({name:"dd"},{$push:{hobby:"sing"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football", "computer" ], "sex" : "b" } 修改后: { "name" : "dd", "age" : 88, "hobby" : [ "football", "computer", "sing" ], "sex" : "b" }

$pushAll

向数组中添加多项

查找 name 为 dd 的文档, 将 hobby 域内的数组 增加多项 eat、run、cry
> db.class.update({name:"dd"},{$pushAll:{hobby:["eat","run","cry"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前:  { "name" : "dd", "age" : 88, "hobby" : [ "football" ], "sex" : "b" }
修改后:  { "name" : "dd", "age" : 88, "hobby" : [ "football", "eat", "run", "cry" ], "sex" : "b" }

$pull

从数组中删除一个值,如果有重复的值, 会全部删除

查找 名字 为 dd 删除 hobby 域内数组 的 eat
> db.class.update({name:"dd"},{$pull:{hobby:"eat"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football", "eat", "run", "cry" ], "sex" : "b" } 修改后: { "name" : "dd", "age" : 88, "hobby" : [ "football", "run", "cry" ], "sex" : "b" }

$pullAll

从数组中删除多个值、如果有重复的值, 会全部删除

删除的时候也可以按照条件删除

查找 名字 为 dd 的文档,删除 hobby 域内数组的 eat、run
> db.class.update({name:"dd"},{$pullAll:{hobby:["eat","run"]}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football", "eat", "run", "cry" ], "sex" : "b" } 修改后: { "name" : "dd", "age" : 88, "hobby" : [ "football", "cry" ], "sex" : "b" }

$pop

弹出数组中一项

只能弹出两头的第一个内容

  取值 为 1 弹出最后一项

  取值 为 -1 弹出第一项

删除 名字 为 dd 的 hobby 域内数组的 第一项
> db.class.update({name:"dd"},{$pop:{hobby:1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "hobby" : [ "football", "eat", "run", "cry" ] } 修改后: { "name" : "dd", "hobby" : [ "football", "eat", "run" ] }


删除 名字 为 dd 的 hobby 域内数组的 最后一项 > db.class.update({name:"dd"},{$pop:{hobby:-1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "hobby" : [ "football", "eat", "run", "cry" ] } 修改后: { "name" : "dd", "hobby" : [ "eat", "run", "cry" ] }

$addToSet

向数组中添加一项

不能和已有值重复

如果是重复值则不做任何操作

查找 name 为 mm 的文档, 将 score 域内数组 添加 18 ,若存在则不作修改
> db.class.updateOne({name:"mm"},{$addToSet:{score:18}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17 ] } 修改后: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] }



查找 name 为 mm 的文档, 将 score 域内数组 添加 18 ,若存在则不作修改
> db.class.updateOne({name:"mm"},{$addToSet:{score:18}}) 
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] } 修改后: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] }

$each

对多个值逐一操作

查找 name 为 mm 的文档, 将 score 域内数组 逐一添加 89,26
> db.class.updateOne({name:"mm"},{$push:{score:{$each:[89,26]}}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] } 修改后: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18, 89, 26 ] }

$position

指定位置插入

需要配合 $each 使用, $each 提供值

$position 指定索引位置

 查找 name 为 mm 的文档,在 score 域内数组 将 90 添加在 索引 0 的位置
> db.class.updateOne({name:"mm"},{$push:{score:{$each:[90],$position:0}}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] } 修改后: { "name" : "mm", "age" : 12, "score" : [ 90, 12, 16, 17, 18 ] }

$sort

对数组排序

搭配 $each 使用

  1 为升序,

  -1 为降序

查找 name 为 mm 的文档 ,将 score 域内数组 升序排列
> db.class.updateOne({name:"mm"},{$push:{score:{$each:[],$sort:1}}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 90, 12, 19, 17, 18 ] } 修改后: { "name" : "mm", "age" : 12, "score" : [ 12, 17, 18, 19, 90] }

 

原文地址:https://www.cnblogs.com/shijieli/p/10460008.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one