mongo更新文档中的数组

2020-05-05  本文已影响0人  江江的大猪
{
    "_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
            }
        }
    ]
}

之前的更新逻辑是,取出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)));

// 使用$占位符更新(只会更新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")));
上一篇下一篇

猜你喜欢

热点阅读