MongoDB+SpringBoot,数组嵌套数组修改

这个问题之前遇到找了好久的资料,现在写出来记录一下

我现在有数据:

db.aaa.insertMany(
[{

   "userId":1,
   "letter":[{
        "letterId" : 1,
        "letterMsg" : [{
                "letterMsgId" : 241,
                "name" : "我是一个客服"
            },{
                "letterMsgId" : 282,
                "name" : "我是大聪明"
            }]
    }]
 },{
  "userId":2,
  "letter":[{
      "letterId" : 3,
      "letterMsg" : [{
          "letterMsgId" : 244,
          "name" : "害怕的php"
       }]
  }]
}
])

现在我的需求是,希望修改userId=1的letter数组下letterId=1的letterMsg数组下,letterMsgId为282的name的值

 

mongDB提供了$[array],并使用arrayFilters去过滤数组,如果用mongDB语句的话,实现出来应该是这样:

db.aaa.update(
   {"userId":1},
   { $set: { "letter.$[letter].letterMsg.$[letterMsg].name":"干啥呢"} },
   { arrayFilters: [ { "letter.letterId": 1},{"letterMsg.letterMsgId":282}], 
   upsert: true}
)

如果用java 实现起来的话,目前我会的有两种方式,

 

第一种:mongoTemplate.executeCommand(),直接把语句写出来,执行语句

mongoTemplate.executeCommand("{update: 'aaa'," +
                    "updates: [{" +
                    "q: {'userId':" + 1 + "}," +
                    "u: {$set:{'letter.$[letter].letterMsg.$[letterMsg].name':'干啥呢'}}," +
                    "arrayFilters: [{'letter.letterId':1},{'letterMsg.letterMsgId':282}]" +
                    "}]}");

第二种:也是把语句拼起来,不过是用java代码拼出来

        //拼接set参数
        BasicDBObject update = new BasicDBObject();
        UpdateOptions updateOptions = new UpdateOptions();
        BasicBSONObject eleSetBson = new BasicBSONObject();
        eleSetBson.put("letter.$[letter].letterMsg.$[letterMsg].name","干啥呢");
        update.put("$set",eleSetBson);
        
        //拼接filter参数
        List list = new ArrayList();
        BasicDBObject eleFilterBson = new BasicDBObject();
        eleFilterBson.put("letter.letterId",1);
        list.add(eleFilterBson);
        BasicDBObject eleFilterBson1 = new BasicDBObject();
        eleFilterBson1.put("letterMsg.letterMsgId",282);
        list.add(eleFilterBson1);
        updateOptions.arrayFilters(list);

        Criteria criteria = Criteria.where("userId").is(1);

        mongoTemplate.getCollection("aaa").updateOne(
                criteria.getCriteriaObject(),
                update,
                updateOptions
        );

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你过来啊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值