mongodb 能否直接覆盖内嵌数组中的某条记录?

2021-08-23 10:55:57 +08:00
 dumbbell5kg
{
其他属性...,
"arrayname":[
{ "_id" : "abc", "totalSaleAmount" : NumberDecimal("170")....更多属性 },
{ "_id" : "xyz", "totalSaleAmount" : NumberDecimal("150")....更多属性 }
]
}

比如修改 _id:abc 这条数据,由于前端表单提交传来的是全量数据,一个字段一个字段的去 update 太麻烦了,而且要写复杂的过滤出 abc 这条记录的条件,所以我想直接覆盖 abc 这条记录,有没有 update 语句能直接覆盖整条 abc 记录?

我现在的写法是 spring 的 mongotemplate 先 pull,再 push,这样就产生了两次与 mongo 的交互。

我知道把内嵌数组拆出来就不用写复杂的过滤条件了,但是相对于整个文档的查询来说,内嵌数组的更新相对频率较低
1612 次点击
所在节点    MongoDB
4 条回复
lxz6597863
2021-08-23 11:41:28 +08:00
ch2
2021-08-23 12:57:42 +08:00
find_and_modify
libook
2021-08-23 19:22:29 +08:00
之前研究过这个问题,MongoDB 最小操作单位是 document,官方给出的建议是,如果希望频繁操作数组里的元素,最好拆成单独的集合……
dumbbell5kg
2021-08-24 10:23:06 +08:00
谢谢大家的回复,使用 mongodb 的$[<identifier>]和 arrayFilters 可以达到目的,代码如下:
mongoTemplate.updateFirst(query(where("_id").is(id)),
new Update().set("menuStakeholder.$[x]", data).filterArray(where("x.groupId").is(groupId)),
xxx.class)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/797418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX