这个问题之前遇到找了好久的资料,现在写出来记录一下
我现在有数据:
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
);