mongodb 更新嵌套数组的值[通俗易懂]

mongodb 更新嵌套数组的值[通俗易懂]概要 本文主要讲述在 mongodb 中,怎么更新嵌套数组的值。 使用$更新数组 测试 for (let i = 0; i < 3; i++) { let data = { name1_1: &

mongodb 更新嵌套数组的值

概要

本文主要讲述在 mongodb 中,怎么更新嵌套数组的值。

mongodb 更新嵌套数组的值[通俗易懂]

 使用$更新数组

  1. 基本语法  { <array>.$ : value } 
  2. 可以用于:update, findAndUpdate 等方法
  3. $是一个占位符一样的存在。代表被匹配的数组中的一个元素
  4. 可以匹配一个数组,匹配多个是会异常  index 0: 2 – Too many positional (i.e. “$”) elements found in path … ,即:只能在一层嵌套的数组中使用 $
  5. 示例 
    db.collection.update(
       { <array>: value ... },
       { <update operator>: { "<array>.$" : value } }
    )

    代码100分

     

 测试

  1.     创建一个测试数据
    mongodb 更新嵌套数组的值[通俗易懂]

    代码100分for (let i = 0; i < 3; i++) {    
        let data = {
            name1_1: "test" + i,
            arr_1: [{
                a: i,
                b: 2
            }, {
                a: i + 1,
                b: 2
            }]
        };
        db.nestedUpdate.insert(data);
    }

    创建数据脚本

    数据截图:

    mongodb 更新嵌套数组的值[通俗易懂]

     

  2. 我想更新arr_1数组中,a = 1 的对象,更新为 {a:11,b:12} 运行更新代码,如下:
    db.nestedUpdate.updateMany({
        "arr_1.a": 1
    }, {
        $set: {
            "arr_1.$.a": 11,
            "arr_1.$.b": 12,
        }
    })

     运行后数据截图:

    mongodb 更新嵌套数组的值[通俗易懂]

  3.   针对上述结构,更新 a= 11 的对象值(与上面不同,上面是更新对象里面的一个值),运行一下代码:
    代码100分db.nestedUpdate.updateMany({    "arr_1.a": 11}, {    $set: {
       "arr_1.$": {a:11, c:[1,2,3]}
    } })

    运行结果:

    mongodb 更新嵌套数组的值[通俗易懂]

     

  4.  继续编辑,修改 arr_1.c 的元素,很容易想到如下:

    db.nestedUpdate.updateMany({
        "arr_1.c": 1
    }, {
        $set: {
            "arr_1.$.$": 11,
        }
    })

    然而,最终的运行结果却是: [Error] index 0: 2 – Too many positional (i.e. “$”) elements found in path “arr_1.$.$” 

     那么,我想更新数组中的数组下的一个元素这么办呢?下面介绍两种方法:1、遍历数组修改,2、使用 arrayFilter。个人推荐 arrayFilter 方式。

.find.foreach + save (循环判断保存法)

  1. 通过 .find 找到满足条件的集合,(但只能找到根节点)
  2. 遍历需要修改的节点,修改其值,(先遍历arr_1, 在遍历 arr_1.c)
  3. 把修改完成的对象,通过 save 方法更新回数据库。
  4. 代码如下
    // 查找所有
    var all1 = db.nestedUpdate.find({});
    all1.forEach(function(it) {   
        var modified = false;
            // 遍历 arr_1
        for (var i = 0; i < it.arr_1.length; ++i) {
            var ac1 = it.arr_1[i];
            // 判断需要修改的
                    if (ac1.c && ac1.c.length > 0 && ac1.c[0] == 1) {
                ac1.c[0] = 1111;
                modified = true;
            }
        }
        
        if (modified) {
            db.nestedUpdate.save(it);
        }
    })

    mongodb 更新嵌套数组的值[通俗易懂]

 利用arrayFilter

  • 基本语法
db.collection.updateMany(
   { <query conditions> },
   { <update operator>: { "<array>.$[<identifier>]" : value } },
   { arrayFilters: [ { <identifier>: <condition> } ] }
)

 注意

  • arrayFilter 数组中的顶级字段不能重复,如下:出现了两个 idx0,运行报错 index 0: 9 – Found multiple array filters with the same top-level field name idx0 
    mongodb 更新嵌套数组的值[通俗易懂]

    db.nestedUpdate.updateMany({}, {
        $set: {
            "arr_1.$[idx0].c.$[idx1]": 1
        }
    }, {
        arrayFilters: [
            {
                // idx0 满足条件: 需存在 c 字段
                "idx0.c": {
                    $exists: true
                },            
            },
            {
                "idx0.a": 1,            
            },
            {
                // idx1: 满足 值为 111
                "idx1": 1111
            }
        ]
    });
    > [Error] index 0: 9 - Found multiple array filters with the same top-level field name idx0
      at line 1, column 1

    View Code

  • arrayFilter 中可以嵌套条件,如:
    mongodb 更新嵌套数组的值[通俗易懂]

    db.nestedUpdate.updateMany({}, {
        $set: {
            "arr_1.$[idx0].c.$[idx1]": 1
        }
    }, {
        arrayFilters: [
            {
                // idx0 满足条件: 需存在 c 字段
                "idx0.c": {
                    $exists: true
                },
                "idx0.a": 1,
            },
            {
                // idx1: 满足 值为 111
                "idx1": 1111
            }
        ]
    });
    
    // 或
    
    db.nestedUpdate.updateMany({}, {
        $set: {
            "arr_1.$[idx0].c.$[idx1]": 1
        }
    }, {
        arrayFilters: [
            {
                // idx0 满足条件: 需存在 c 字段
                idx0: {
                    c: {
                        $exists: true
                    },
                    a: 1
                }
            },
            {
                // idx1: 满足 值为 111
                "idx1": 1111
            }
        ]
    });

    View Code

  • arrayFilter 必须包含所有的索引的条件。否则出现错误 [Error] index 0: 2 – No array filter found for identifier “idx2” in path “arr_1.$[].arr_1_1.$[idx1].arr1_1_1.$[idx2]” 
    mongodb 更新嵌套数组的值[通俗易懂]

    db.nestedUpdate1.updateMany({}, {
        $set: {
            "arr_1.$[].arr_1_1.$[idx1].arr1_1_1.$[idx2]": null
        }
    }, {
        arrayFilters: [
            {
                // idx1: 满足 name <= 1
                "idx1.name": {
                    $lte: 1
                }
            },
            
        ]
    })
    > [Error] index 0: 2 - No array filter found for identifier "idx2" in path "arr_1.$[].arr_1_1.$[idx1].arr1_1_1.$[idx2]"
      at line 1, column 1
    > 时间: 0.003s

    完整代码

  • $[idx] 中的idx 可以自定义名字,只需要arrayFilter中名字一样就可以,如 $[i], $[j]
  • 不止updateMany可以用,update、findAndUpdate、findAndModify 等也可以用
  • 可以与$[] 一起使用,需保证数组中的所有元素都满足后面的条件,如:
    db.nestedUpdate1.updateMany({}, {    $set: {        "arr_1.$[].arr_1_1.$[idx1].arr1_1_1.$[idx2]": null    }}, {    arrayFilters: [        {            // idx1: 满足 name <= 1            "idx1.name": {                $lte: 1            }        },        {            idx2: 1        }    ]})

    运行示意:mongodb 更新嵌套数组的值[通俗易懂]

     

     

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10255.html

(0)
上一篇 2023-01-22 15:00
下一篇 2023-01-22

相关推荐

  • 如何使用 SQL 函数处理数据「建议收藏」

    如何使用 SQL 函数处理数据「建议收藏」本文介绍什么是函数,DBMS 支持何种函数,以及如何使用这些函数;还将讲解为什么 SQL 函数的使用可能会带来问题。 一、函数 与大多数其他计算机语言一样,SQL 也可以用函数来处理数据。函数一般是在

    2023-05-16
    117
  • MySQL打造扛得住的数据库架构笔记-目前只有监控篇笔记「终于解决」

    MySQL打造扛得住的数据库架构笔记-目前只有监控篇笔记「终于解决」[TOC] MySQL打造扛得住的数据库架构笔记 数据库监控 要监控的内容 对数据库的可用性进行监控: 不是仅仅监控数据库进程是否存在,要通过网络连接到数据库并确定是可用的 对数据库性能进行监控: …

    2023-02-14
    136
  • 深入理解Python def用法

    深入理解Python def用法Python 是一种非常流行和强大的编程语言,它因其简单易学、功能丰富、可读性好和可扩展性等诸多优点而备受青睐。在 Python 中,使用 def 语句来定义函数,可以方便地重复使用语句块,提高代码的可维护性和重用性。但是 Python 的 def 用法还是有一些细节需要深入理解和掌握。本篇文章将重点系统地介绍 Python def 的各个方面。

    2024-06-11
    48
  • 利用Python构建高效的字典数据结构

    利用Python构建高效的字典数据结构Python是一种直观而又高效的编程语言,最常用的数据结构之一就是字典。字典数据结构是Python的核心之一,它的高效和易用性是Python为什么能够快速成为最受欢迎的编程语言之一的主要原因。

    2024-02-14
    89
  • Python与MongoDB联手,打造高效数据处理系统

    Python与MongoDB联手,打造高效数据处理系统随着互联网技术的发展,海量数据的处理已成为众多企业的重要任务。而作为一种高效的非关系型数据库,MongoDB正逐渐成为了越来越多数据处理应用的选择。在本文中,我们将介绍如何使用Python与MongoDB联手,搭建一个高效的数据处理系统,帮助企业更好地处理海量数据。

    2024-08-07
    24
  • 使用pip更新Python版本

    使用pip更新Python版本Python是一种非常流行的编程语言,它不断地更新和发展,每个新版本都会带来更多的功能和性能提升。随着时间推移,旧版的Python也变得过时和不安全,因此更新Python版本是非常必要的。本文将介绍如何使用pip更新Python版本。

    2024-07-15
    40
  • 欢迎参加python(欢迎参加我们的婚礼)

    欢迎参加python(欢迎参加我们的婚礼)Python在各个领域都得到广泛使用,比如说:科学计算,数据分析,数据挖掘,运维自动化,云计算,人工智能等等,所以是非常受欢迎的。

    2023-11-28
    158
  • SQL练习——2020滴滴面试题 – Lu[亲测有效]

    SQL练习——2020滴滴面试题 – Lu[亲测有效]一、题目 题目信息:“订单信息表”记录了巴西乘客使用打车软件的信息,包括订单呼叫、应答、取消、完单时间。(滴滴2020数据分析面试题) 字段信息: order_id:订单ID,呼叫订单识别号 pass

    2023-04-14
    145

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注