MongoDB 聚合管道中使用数组表达式运算符获取数组长度($size)和反转数组($reverseArray)

news2024/10/2 8:22:51

数组表达式运算符主要用于文档中数组的操作,本篇我们主要介绍如何使用数组表达式运算符获取数组的长度以及对数组中的数据进行反转:

一、准备数据

初始化成员数据

db.persons.insertMany([
    { "_id" : "1001", "name" : "张三", "fruits" : [ "apple", "orange" ] },
    { "_id" : "1002", "name" : "李四", "fruits" : [ "banana", "apple" ] },
    { "_id" : "1003", "name" : "王五", "fruits" : [ "banana", "apple", "orange" ] },
    { "_id" : "1004", "name" : "赵六", "fruits" : [ ] },
    { "_id" : "1005", "name" : "田七" },
])

二、获取数组长度($size)

语法:{ $size: <expression> }

        获取数组长度

例子:计算成员喜欢的水果数量

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "favoriteFruitQuantity": {
                $size: "$fruits"
            }
        }
    }
])

聚合查询的结果如下:

{
	"ok" : 0,
	"errmsg" : "The argument to $size must be an array, but was of type: missing",
	"code" : 17124,
	"codeName" : "Location17124"
}

发现报错了,原因是在编号为1005的成员中不存在fruits字段导致的。

这里我们需要使用$isArray断言数组操作进行聚合查询,如果您对$isArray断言数组操作不太了解,可以参考:

MongoDB 聚合管道中使用数组表达式运算符断言数组($isArray)https://blog.csdn.net/m1729339749/article/details/130162535

下面我们使用$isArray断言数组操作改进聚合查询:

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "favoriteFruitQuantity": {
                $cond: {
                    if: { $isArray: "$fruits" },
                    then: { $size: "$fruits" },
                    else: 0
                }
            }
        }
    }
])

聚合查询的结果如下:

{ "_id" : "1001", "name" : "张三", "favoriteFruitQuantity" : 2 }
{ "_id" : "1002", "name" : "李四", "favoriteFruitQuantity" : 2 }
{ "_id" : "1003", "name" : "王五", "favoriteFruitQuantity" : 3 }
{ "_id" : "1004", "name" : "赵六", "favoriteFruitQuantity" : 0 }
{ "_id" : "1005", "name" : "田七", "favoriteFruitQuantity" : 0 }

三、反转数组($reverseArray)

语法:{ $reverseArray: <array expression> }

        对数组中的数据进行反转

例子:反转喜欢的水果顺序

db.persons.aggregate([
    { 
        $project: {
            "name": 1,
            "reverseFruits": { $reverseArray: "$fruits" }
        }
    }
])

聚合查询的结果如下:

{ "_id" : "1001", "name" : "张三", "reverseFruits" : [ "orange", "apple" ] }
{ "_id" : "1002", "name" : "李四", "reverseFruits" : [ "apple", "banana" ] }
{ "_id" : "1003", "name" : "王五", "reverseFruits" : [ "orange", "apple", "banana" ] }
{ "_id" : "1004", "name" : "赵六", "reverseFruits" : [ ] }
{ "_id" : "1005", "name" : "田七", "reverseFruits" : null }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go错误处理

func test() {num1 : 10num2 : 0result : num1 / num2fmt.Println("result", result)} func main() {test()for {fmt.Println("运行完毕&#xff01; main 下面的代码")time.Sleep(time.Second)}}在默认情况下&#xff0c;当发生错误后(panic) ,程序就会…

港联证券|揭秘涨停 旅游板块掀涨停潮

今天&#xff0c;A股三大股指低开低走。沪深两市收盘共38股涨停。剔除7只ST股&#xff0c;合计31股涨停。另外&#xff0c;14股封板未遂&#xff0c;整体封板率为73.08%。 涨停战场&#xff1a;6股封单资金超亿元 港联证券核算&#xff0c;从收盘涨停板封单量来看&#xff0c;…

【Pytorch】数据预处理

Pytorch是机器学习里面常用的框架之一&#xff0c;我们在学习机器学习之前最好需要学习如何使用这个框架对我们将要使用的数据数据进行预处理操作。 如果我们想要学习好pytorch里面的方法&#xff0c;我们需要常去用一下dir()和help()函数&#xff0c;它们一个会帮我们查看某个…

计算机软考考什么?怎么备考啊?

计算机软考是国家承认的计算机职业资格考试&#xff0c;是计算机行业从业者晋升职业等级的重要途径。计算机软考分为三个等级&#xff0c;分别是&#xff1a;初级、中级和高级。 备考计算机软考需要全面准备&#xff0c;下面我将从如何选择考试科目、如何制定学习计划、如何进…

【STL系列】unordered_set和unordered_map

前言 之前&#xff0c;我们介绍了STL中树形结构容器:set、map、multiset、multimap。 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时的效率可达到O(logN)&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;但当树中的结点非…

九龙证券|昨夜,大涨!蔚来5.99%,小鹏15.22%,理想6.39%

当地时间周一&#xff0c;美股三大指数低开高走&#xff0c;尾盘小幅收涨。盘面上&#xff0c;银行股、航空股遍及上涨。 展望本周&#xff0c;包括美联储理事沃勒、鲍曼等官员将迎来下月会议沉默期前的最终说话&#xff0c;投资者需关注其对经济和货币政策前景的看法。此外&am…

牛客网华为机考题库 C++

题目汇总HJ2 计算某字符出现次数HJ3 明明的随机数HJ4 字符串分隔HJ5 进制转换HJ6 质数因子HJ7 取近似值HJ8 合并表记录 哈希表HJ9 提取不重复的整数HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购…

快速创建springboot+springcloud项目(nacos,seata,sentinel,gateway,openfeign)

一、创建一个maven项目 1.file->new->project 2.创建maven项目 3.删除src文件夹 4.在pom.xml文件中引入springboot和cloudAlibaba依赖 <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId>&l…

用Python解决Excel问题的最佳姿势

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 「问题说明」 这次要处理的excel有两个sheet&#xff0c;要根据其中一个sheet的数据来计算另外一个sheet的值。造成问…

循环神经网络

循环神经网络(Recurrent Neural Network&#xff0c;RNN)与卷积神经网络一样,都是深度学习中的重要部分。循环神经网络可以看作一类具有短期记忆能力的神经网络。在循环神经网络中&#xff0c;神经元不但可以接收其他神经元的信息&#xff0c;也可以接收自身的信息&#xff0c;…

ChatGPT 速通手册——开始提问

开始提问 当我们完成注册后&#xff0c;页面自动会跳转到ChatGPT的主页面&#xff0c;在这里我们就可以开始进行对话了。 我们在页面下方的输入框中填写问题&#xff0c;然后回车或者点击小飞机&#xff0c;我们的问题和ChatGPT的答案就会在页面上方以一问一答的格式展现出来…

Packet Tracer 的安装过程

Packet Tracer 的安装过程 下载地址 链接&#xff1a;https://pan.baidu.com/s/1KO-vJ1p-miU7LXRH92hLww 提取码&#xff1a;ocwu 、双击运行 Crack 文件夹中的"Patch.exe"程序&#xff0c;点击 Patch&#xff1b; 7、即可看到显示激活成功&#xff0c;接下来打开…

Matplotlib学习挑战第四关-网格线grid

Matplotlib 网格线 我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。 grid() 方法语法格式如下&#xff1a; matplotlib.pyplot.grid(bNone, whichmajor, axisboth, )b&#xff1a;可选&#xff0c;默认为 None&#xff0c;可以设置布尔值&#xff0c;true 为显…

CentOS 软件包管理

一、文件打包与压缩 1.du命令 --查看目录或文件所占磁盘空间的大小 -h&#xff0c;以K,M,G为单位显示统计结果&#xff08;默认单位为字节&#xff09; -s&#xff0c;查看目录本身的大小 2.打包压缩 tar命令--打包&#xff0c;打包文件的扩展名为.tar…

如何在TypeScript中使用泛型

介绍 泛型是静态类型语言的基本特征&#xff0c;允许开发人员将类型作为参数传递给另一种类型、函数或其他结构。当开发人员使他们的组件成为通用组件时&#xff0c;他们使该组件能够接受和强制在使用组件时传入的类型&#xff0c;这提高了代码灵活性&#xff0c;使组件可重用…

【计算机网络——计算机网络的概念,组成,功能和分类以及相关的性能指标,分层结构和协议,TCP/IP参考模型】

文章目录计算机网络体系结构计算机网络的概念、组成、功能和分类标准化工作及相关组织速率相关的性能指标时延、时延带宽积、PTT和利用率分层结构、协议、接口和服务OSI参考模型TCP IP参考模型计算机网络体系结构 计算机网络的概念、组成、功能和分类 计算机网络的概念 计算…

EasyRecovery免费电脑硬盘数据恢复软件使用教程

EasyRecovery硬盘数据恢复软件采用最新的数据扫描引擎&#xff0c;从磁盘底层读出原始的扇区数据&#xff0c;经过高级的数据分析算法&#xff0c;把丢失的目录和文件在内存中重建出原分区和原来的目录结构&#xff0c;数据恢复的效果非常好。操作简单&#xff0c;向导式的界面…

如何使用katalon studio 完成 get/post 请求发送

前言 katalon studio作为目前最火的自动化测试工具之一&#xff0c;不仅仅只能完成webUI自动化&#xff0c;更是能完成api、app以及桌面应用程序的自动化测试。本文将讲解一下katalon studio是如果完成接口测试的。 请求发送 get请求 1、先在object repository里new一个请求…

代码随想录算法训练营第五十九天 | 503.下一个更大元素II、42. 接雨水

打卡第59天&#xff0c;继续单调栈。 今日任务 503.下一个更大元素II42.接雨水 503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下…

C++ 类之间的纵向关系-继承

目录 继承的基本概念 定义 使用方法 内存空间 继承下构造析构执行的顺序 构造函数 继承的基本概念 定义 被继承的类叫做基类&#xff08;父类&#xff09;&#xff0c;继承的类叫派生类&#xff08;子类&#xff09;&#xff0c;在子类类名后面加:继承方式 父类 class …