美文网首页
mongo更新文档中的数组

mongo更新文档中的数组

作者: 江江的大猪 | 来源:发表于2020-05-05 23:52 被阅读0次
  • 测试数据如下,memberList里存放的是每个成员member的内嵌文档
{
    "_id" : ObjectId("5eb17213bcab265fc1959eb7"),
    "memberList" : [ 
        {
            "uid" : "1",
            "nickName" : "昵称1",
            "locInfo" : {
                "lon" : 116.47274,
                "lat" : 39.9932969444444
            }
        }, 
        {
            "uid" : "2",
            "nickName" : ""昵称2",
            "locInfo" : {
                "lon" : 116.47274,
                "lat" : 39.99331
            }
        }
    ]
}
  • 之前线上碰到过诡异的问题,更新member的昵称不生效

之前的更新逻辑是,取出memberList,根据uid找到要修改的member,修改之后将memberList写入进去,更新代码示例如下:

// 因为写入的是整个memberList,所以在并发修改的场景下,就会出现相互覆盖的问题
// 有问题的时间序:A、B同时读取memberList -> A修改自己的数据并将memberList写库 -> B修改自己的数据并将memberList写库
// 这样B的更新就会将A的更新覆盖掉
collection.updateOne(eq("_id", new ObjectId("5eb17213bcab265fc1959eb7")), new Document("$set", new Document("memberList", memberList)));

  • 要解决这个问题可以考虑不使用内嵌文档结构,使用经典结构,将member单独开一个collection,就不会有问题了
  • 在不改动库表结构的前提下,想要避免这种问题,就需要做到只更新memberList中满足条件的member的指定字段。注意这里是两步,1是找到要更新的member,2是只更新member中的指定字段,这样就会避免覆盖掉其他member或者同一个member中的其他字段了
  • 可以考虑使用$占位符或者mongo3.6之后的arrayFilter来更新,示例如下:
// 使用$占位符更新(只会更新memberList中uid为1的第一个member)
collection.updateOne(combine(eq("_id", objectId), eq("memberList.uid", "1")), new Document("$set", new Document("memberList.$.nickName", "哈哈哈")));
// 使用arrayFilter更新(memberList中uid为1的member都会被更新),只有mongo3.6以后版本支持
collection.updateOne(eq("_id", objectId), new Document("$set", new Document("memberList.$[elem].nickName", "哈哈哈")), new UpdateOptions().arrayFilters(Arrays.asList(eq("elem.uid", "1")));
  • mongo中对数组的操作需要想的多一点,增加用push,删除用pull,不要直接用set更新整个数据,否则还是会有覆盖问题

相关文章

  • mongo更新文档中的数组

    测试数据如下,memberList里存放的是每个成员member的内嵌文档 之前线上碰到过诡异的问题,更新memb...

  • MongoDB 之更新指令

    更新 简单更新: 文档替换 在mongo shell 中执行js 代码: python 中使用pymongo 修改...

  • mongodb 数组更新及嵌套数组插入命令操作

    本人使用的mongo为3.2.10,最新版本更新请查看官方文档 原始数据结构如下 更新一级数组 更新一级数组下的t...

  • Mongodb基本操作

    mongodb数据库管理: Mongodb插入文档: Mongodb更新文档 Mongodb删除文档: Mongo...

  • MongoDB更新文档 --- 2022-04-03

    本章介绍,通过mongo shell更新MongoDB文档数据。MongoDB通过各种类型的操作符实现的不同的更新...

  • mongo对内嵌数组的简单操作

    由于mongo的弱关联关系,导致mongo的内嵌数组会被频繁使用,以达到一定的"关联关系"。所以对mongo的数组...

  • 固定集合

    mongo支持创建固定集合,固定集合要事先创建,并且大小固定。 固定集合不支持删除文档,并且更新不得导致文档移动。...

  • ES 针对文档处理数组

    ES 7.5 局部更新文档 数组指定元素移除 数组添加元素

  • pymongo.errors.CursorNotFound: C

    需求:使用python连接mongo,遍历集合中的文档 错误:pymongo.errors.CursorNotFo...

  • mongodb学习笔记

    1.mongodb特性 2.mongo常用操作 update是对文档替换,而不是局部修改默认情况update更新匹...

网友评论

      本文标题:mongo更新文档中的数组

      本文链接:https://www.haomeiwen.com/subject/cujbghtx.html