MongoDB对数组进行增删改查操作

bangongJIAO1@c 发布于 2025-11-30 阅读(4)
目录
  • 前言
  • mongoDB语法
    • 修改数组节点–$set
    • 增加数组节点–$push
    • 删除数组节点–$pull
  • spring语法
    • 修改数组节点–$set
    • 增加数组节点–$push
    • 删除数组节点–$pull
  • 总结

    前言

    在使用mongo进行业务处理中,有时需要对文档(document)中的某个数组节点进行操作,这是下面要提到的 p u l l , pull, pull,push,$set操作。

    mongoDB语法

    设置一个类ExtendEntity

    示例数据如下:

    {
      "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文档

    //将数组extendContents中extendCode为EX1002值更新
    //$表示匹配到的第一个为EX1002的对象修改掉
    //如果想匹配多个值,可修改为$[]
    db.ExtendEntity.update({"extendContents.extendCode":"EX1002"},{$set:{"extendContents.$.extendValue":"更新1002的值"}})
    //也可以指定下标,从0开始,将数组extendContents第二个对象修改掉
    db.ExtendEntity.update({"extendContents.extendCode":"EX1002"},{$set:{"extendContents.1.extendValue":"更新1002的值"}})

    增加数组节点–$push

    参考: 进入官方$push文档

    //在数组extendContents中增加一个元素
    db.ExtendEntity.update({"extendId": "2022061500002"},{$push:{"extendContents":{
          "extendCode": "EX1003",
          "extendName": "扩展3",
          "extendValue": "电脑3",
          "order": 3,
          "hasValue": true
        }})

    删除数组节点–$pull

    参考: 进入官方$pull文档

    需要该对象中每个属性值与mongodb数组中完全相同才能删除

    //从数组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
        }})

    如果需要按数据中某个对象元素的某个属性删除

    //删除数组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

    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

    // 字符串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

    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方法。

    总结