前言
在使用mongo进行业务处理中,有时需要对文档(document)中的某个数组节点进行操作,这是下面要提到的 p u l l , pull, pull,push,$set操作。
mongoDB语法
设置一个类ExtendEntity
示例数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | { "extendId" : "2022061500001" , "taskId" : "T0271001" , "type" : "1" , "extendContents" : [ { "extendCode" : "EX1001" , "extendName" : "扩展1" , "extendValue" : "手机屏幕" , "order" : 1, "hasValue" : true } ], "creator" : "LiMing" , "createTime" : "2022-06-15 14:03:40" , "editor" : "LiMing" , "editTime" : "2022-06-15 14:03:40" }, { "extendId" : "2022061500002" , "taskId" : "T0271001" , "type" : "1" , "extendContents" : [ { "extendCode" : "EX1001" , "extendName" : "扩展1" , "extendValue" : "手机屏幕" , "order" : 1, "hasValue" : true }, { "extendCode" : "EX1002" , "extendName" : "扩展2" , "extendValue" : "电脑" , "order" : 2, "hasValue" : true } ], "creator" : "ZhangSan" , "createTime" : "2022-06-15 14:03:40" , "editor" : "LiMing" , "editTime" : "2022-06-15 14:03:40" } |
修改数组节点–$set
参考: 进入官方$set文档
1 2 3 4 | //将数组extendContents中extendCode为EX1002值更新 //$表示匹配到的第一个为EX1002的对象修改掉 //如果想匹配多个值,可修改为$[] db.ExtendEntity.update({ "extendContents.extendCode" : "EX1002" },{$set:{ "extendContents.$.extendValue" : "更新1002的值" }}) |
1 2 | //也可以指定下标,从0开始,将数组extendContents第二个对象修改掉 db.ExtendEntity.update({ "extendContents.extendCode" : "EX1002" },{$set:{ "extendContents.1.extendValue" : "更新1002的值" }}) |
增加数组节点–$push
参考: 进入官方$push文档
1 2 3 4 5 6 7 8 | //在数组extendContents中增加一个元素 db.ExtendEntity.update({ "extendId" : "2022061500002" },{$push:{ "extendContents" :{ "extendCode" : "EX1003" , "extendName" : "扩展3" , "extendValue" : "电脑3" , "order" : 3 , "hasValue" : true }}) |
删除数组节点–$pull
参考: 进入官方$pull文档
需要该对象中每个属性值与mongodb数组中完全相同才能删除
1 2 3 4 5 6 7 8 9 | //从数组extendContents中删除一个对象元素 { "extendCode" : "EX1003" , "extendName" : "扩展3" , "extendValue" : "电脑3" , "order" : 3 , "hasValue" : true } db.ExtendEntity.update({ "extendId" : "2022061500002" },{$pull:{ "extendContents" :{ "extendCode" : "EX1003" , "extendName" : "扩展3" , "extendValue" : "电脑3" , "order" : 3 , "hasValue" : true }}) |
如果需要按数据中某个对象元素的某个属性删除
1 2 | //删除数组extendContents中extendCode为EX1003的对象元素 db.ExtendEntity.update({ "extendId" : "2022061500002" },{$pull:{ "extendContents" :{ "extendCode" : "EX1003" }}) |
spring语法
当项目使用sping+mongodb时,spring为我们提供了相应的接口。使用org.springframework.data.mongodb.core.queryUpdate类中的set、push、pull方法。
修改数组节点–$set
1 2 3 4 5 6 7 | Update update = new Update(); //修改元素 update.set( "extendContents.$.extendValue" , "更新1002的值" ); update.set( "editTime" , new Date()); //查询条件 Query query = new Query(Criteria.where( "extendContents.extendCode" ).is( "EX1002" )); mongoTemplate.updateFirst(query, update, ExtendEntity. class ); |
增加数组节点–$push
1 2 3 4 5 6 7 8 9 10 | // 字符串text的对象实体为ExtendContent String text = "{ " extendCode ": " EX1003 "," extendName ": " 扩展 3 "," extendValue ": " 电脑 3 "," order ": 3," hasValue ": true}" ; ExtendContent addExtend = JSONObject.parseObject(text, ExtendContent. class ); Update update = new Update(); //添加元素 update.push( "extendContents" ,addExtend); update.set( "editTime" , new Date()); //查询条件 Query query = new Query(Criteria.where( "extendId" ).is( "2022061500002" )); mongoTemplate.updateFirst(query, update, ExtendEntity. class ); |
删除数组节点–$pull
1 2 3 4 5 6 7 | Update update = new Update(); //删除元素,删除数组extendContents中extendCode=EX1003的对象元素 update.pull( "extendContents" , new BasicDBObject( "extendCode" , "EX1003" )); update.set( "editTime" , new Date()); //查询条件 Query query = new Query(Criteria.where( "extendId" ).is( "2022061500002" )); mongoTemplate.updateFirst(query, update, ExtendEntity. class ); |
注: 以上示例均使用mongoTemplate.updateFirst,如需要处理多条数据,可使用mongoTemplate.updateMulti方法。
总结
到此这篇关于MongoDB对数组进行增删改查操作的文章就介绍到这了,更多相关MongoDB对数组增删改查内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!