
mongodb:更新、删除文档
发布日期:2021-05-04 18:49:04
浏览次数:19
分类:精选文章
本文共 5188 字,大约阅读时间需要 17 分钟。
文章目录
语法
db..update( , , )// 筛选条件,同find的query// 更新的内容// 更新操作的参数
- 不写第三个参数的时候,会用
<update>
文档完全替换查询出的文档 - 当查询语句匹配到多个时候,只会修改第一个
// 第二个操作符的一些说明:// 更新操作符{ $set: { : , ... } }// 删除操作符{ $unset: { : "", ... } }// 重命名操作符{ $rename: { : , ... } }// 加减操作符{ $inc: { : , ... } }// 乘除操作符{ $mul: { : , ... } }// 最小{ $min: { : , ... } }// 最大{ $max: { : , ... } }// 数组操作符:// 向数组字段中添加元素{ $addToSet: { : , ... } }// 数组字段中删除元素,1删除最后一个,-1删除第一个{ $pop: { : <-1 | 1>, ... } }// 数组删除特定的元素{ $pull: { : , ... } }{ $pullAll: { : [ , , ...], ... } }// 数组添加特定的元素// 和$addToSet相似,但是$push 更强大{ $push: { : , ... } }// $position 将元素插入到数组指定位置$position: // $sort 对数组进行排序,1正序小到大,-1倒叙大到小$sort: <1 | -1>// 截取部分数组$slice: // 占位符 .$// 更新数组中所有元素 .$[]
// 第三个操作符的一些说明:// 是否需要更新多个文档。因为默认情况下,即使我们筛选除了多个文档,update命令只会更新一篇文档{ multi: }// 是更新还是新建,默认是false,当没有匹配到文档的时候,则不会进行任何操作。当我们设置为true,没匹配到则会创建新文档{ upsert: }
// save 命令,如果document里包含了_id字段,save()命令将会调用db.collection.update()命令并设置(upsert: true)db..save( )
// remove 命令,删除文档db..remove( , )// drop 命令,删除集合db. .drop()
update例子
// 不写第三个参数的时候,会用 `` 文档完全替换查询出的文档db.accounts.update({ name: "Alue" }, { name: "Alue", balance: 120 })
// $set 新增字段infodb.accounts.update( { name: "jack" }, { $set: { // 修改金额 balance: 3000, // 新增的开户日期开户地点 info: { dateOpened: new Date("2016-5-18T16:00:00Z"), branch: "branch1" } } })
// $set 修改字段,当字段为数组或者对象时,用点.运算符// 当数组有2个,你想添加第3个元素时"contact.2": "aaa"db.accounts.update( { name: "jack" }, { $set: { // info 是对象,修改他的branch元素 "info.branch": "branch2" // contact 是数组,修改第 1 项为aaa "contact.0": "aaa" } })
// $unset 删除jack的银行账户余额和开户地点db.accounts.update( { name: "jack" }, { $unset: { // 删除info.branch,这里的 "" 里面写啥都行,没有影响 "info.branch": "" // 删除balance "balance": "" } })
$unset删除数组的一个元素时,数组长度不会变化,而是将那个元素变为null
// $rename 操作符修改 name 字段为 contactdb.accounts.update( { name: "jack" }, { $rename: { "name": "contact" } })
// $rename 操作符修改字段的位置,把info.branch放到根目录,balance字段放到info里面db.accounts.update( { name: "jack" }, { $rename: { "info.branch": "branch", "balance": "info.balance" } })
// $inc 操作符使余额减去0.5db.accounts.update( { name: "jack" }, { $inc: { balance: -0.5 } })
// $mul 操作符使余额乘0.5db.accounts.update( { name: "jack" }, { $mul: { balance: 0.5 } })
// $min 操作符更新余额,如果balance字段小于5000那就保留原有值,如果不小于5000,则赋值为5000db.accounts.update( { name: "jack" }, { $min: { "balance": 5000 } })
特殊情况:比如你用 $min 比较 null 和 5000,那么会判断 null 比较小,从而把余额更新为 null,具体比较规则如下
![]()
// $addToSet 操作符向contact数组中添加China// 添加的新值重复的话,不会生效// 插入多个 "contact": ["China", "US"]db.accounts.update( { name: "jack" }, { $addToSet: { "contact": "China" } })
// $addToSet、$each 操作符向contact数组中添加多个db.accounts.update( { name: "jack" }, { $addToSet: { "contact": { $each: ["China", "US"] } } })
// $pop 操作符向contact数组中删除最后一个元素db.accounts.update( { name: "jack" }, { $pop: { "contact": 1 } })
// find + insert + forEach 将Karen的账户文档复制为Lawrence的账户文档db.accounts.find( { name: "karen" }, { id: 0 }).forEach(function(doc) { var newDoc = doc; newDoc.name = "lawrence"; db.accounts.insert(newDoc)})
// $pull 从karen 的联系方式中删除包含'hi'字母的元素db.accounts.update( { name: "karen" }, { $pull: { "contact": { $regex: /hi/ } } })
// $pullAll { $pull: {: { $in: [ , ] } } }相当于{ $pullAll: { : [ , ] } }
pullAll需要和源文档完全相同才会删除,pull 只要部分相同就会删除
// $push newArray 数组中添加内容db.accounts.update( { name: "karen" }, { $push: { "newArray": "new element" } })
// $push 和 $each 搭配使用,把2,3,4添加进newArray数组// $position 从第0个开始插入,也就是首位// $sort 正序排列// $slice 从结尾开始数8个元素,其余删除掉db.accounts.update( { name: "karen" }, { $push: { newArray: { $each: [2, 3, 4], $position: 0, $sort: 1, // 可以只针对内嵌文档的某一个键来排序,比如键名为value $sort: { value: 1 }, $slice: -8 } } })
position,sort ,slice(执行顺序也是这个顺序) 必须和 $push $each 一起使用,如果只想使用 sort ,可以给 $each 传个空数组 []
// 利用数组占位符$,newArray.$ 中的 $ 就是代表筛选的元素db.accounts.update( { name: "karen", newArray: "pos2" }, { $set: { "newArray.$": "updated" } })
// 利用数组全改 $.[],contact数组中所有元素都被更新为88888db.accounts.update( { name: "karen" }, { $set: { "contact.$[]": "88888" } })
options例子
// 使用multi选项来更新多个符合筛选条件的文档db.accounts.update( { }, { $set: { "currency": "USD" } }, { multi: true })
由于更新多个文档的操作虽然是在单一线程上执行的,如果这时有其他线程要操作数据库,更新的线程会被挂起,不一定能保证原子性,如果对原子性有严格要求,使用mongodb4.0 的事务
save例子
db.accounts.save( { _id: "account2", balance: 100 })
remove删除文档
// 删除balance: 50的文档db.accounts.remove( { balance: 50 })
默认就是删除匹配所有的,update默认是更新一条
// 删除balance: 50的文档,只删除匹配的第一个db.accounts.remove( { balance: 50 }, { justOne: true })
// 删除集合// 一般先看自己在哪个集合show collections// 然后删除db.accounts.drop()
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月23日 16时14分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java并发之ThreadPoolExecutor源码解析(三)
2019-03-06
TCP/IP网络编程之域名及网络地址
2019-03-06
Redis实现之对象(三)
2019-03-06
NodeJS+Express+MongoDB
2019-03-06
(三十一)c#Winform自定义控件-文本框(四)-HZHControls
2019-03-06
(四十四)c#Winform自定义控件-水波-HZHControls
2019-03-06
c#winform主题实现的一个方法
2019-03-06
asp.net打印网页后自动关闭网页【无需插件】
2019-03-06
推荐5个漂亮的网站html源码
2019-03-06
一个人开发的html整站源码分享网站就这么上线了
2019-03-06
SQLServer 查看耗时较多的SQL语句(转)
2019-03-06
【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件
2019-03-06
元旦在家撸了两天Seata源码,你们是咋度过的呢?
2019-03-06
高并发场景下如何优化服务器的性能?
2019-03-06
数据结构与算法系列之目录
2019-03-06
【计算机网络】应用层
2019-03-06
【Markdown】公式指导手册
2019-03-06
【Maven】POM基本概念
2019-03-06
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2019-03-06