推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
dumbbell5kg
V2EX  ›  MongoDB

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

  •  
  •   dumbbell5kg · Aug 23, 2021 · 2327 views
    This topic created in 1748 days ago, the information mentioned may be changed or developed.
    {
    其他属性...,
    "arrayname":[
    { "_id" : "abc", "totalSaleAmount" : NumberDecimal("170")....更多属性 },
    { "_id" : "xyz", "totalSaleAmount" : NumberDecimal("150")....更多属性 }
    ]
    }

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

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

    我知道把内嵌数组拆出来就不用写复杂的过滤条件了,但是相对于整个文档的查询来说,内嵌数组的更新相对频率较低
    4 replies    2021-08-24 10:23:06 +08:00
    ch2
        2
    ch2  
       Aug 23, 2021
    find_and_modify
    libook
        3
    libook  
       Aug 23, 2021 via Android
    之前研究过这个问题,MongoDB 最小操作单位是 document,官方给出的建议是,如果希望频繁操作数组里的元素,最好拆成单独的集合……
    dumbbell5kg
        4
    dumbbell5kg  
    OP
       Aug 24, 2021
    谢谢大家的回复,使用 mongodb 的$[<identifier>]和 arrayFilters 可以达到目的,代码如下:
    mongoTemplate.updateFirst(query(where("_id").is(id)),
    new Update().set("menuStakeholder.$[x]", data).filterArray(where("x.groupId").is(groupId)),
    xxx.class)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1520 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:47 · PVG 00:47 · LAX 09:47 · JFK 12:47
    ♥ Do have faith in what you're doing.