V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
dumbbell5kg
V2EX  ›  MongoDB

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

  •  
  •   dumbbell5kg · 2021-08-23 10:55:57 +08:00 · 1758 次点击
    这是一个创建于 1215 天前的主题,其中的信息可能已经有所发展或是发生改变。
    {
    其他属性...,
    "arrayname":[
    { "_id" : "abc", "totalSaleAmount" : NumberDecimal("170")....更多属性 },
    { "_id" : "xyz", "totalSaleAmount" : NumberDecimal("150")....更多属性 }
    ]
    }

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

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

    我知道把内嵌数组拆出来就不用写复杂的过滤条件了,但是相对于整个文档的查询来说,内嵌数组的更新相对频率较低
    4 条回复    2021-08-24 10:23:06 +08:00
    ch2
        2
    ch2  
       2021-08-23 12:57:42 +08:00
    find_and_modify
    libook
        3
    libook  
       2021-08-23 19:22:29 +08:00 via Android
    之前研究过这个问题,MongoDB 最小操作单位是 document,官方给出的建议是,如果希望频繁操作数组里的元素,最好拆成单独的集合……
    dumbbell5kg
        4
    dumbbell5kg  
    OP
       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)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:21 · PVG 08:21 · LAX 16:21 · JFK 19:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.