MongoDB 聚合管道的文档操作($sort,$skip,$limit,$sample,$unwind)

news2024/11/24 0:21:12

目前为止,我们已经介绍了一部分聚合管道中的管道参数:

        $match:文档过滤

        $group:文档分组,并介绍了分组中的常用操作:$addToSet,$avg,$sum,$min,$max等。

        $addFields:添加字段,等效于$set

        $unset:移除字段

        $project:字段投影

如果需要进一步了解可以参考:

MongoDB 聚合管道的文档筛选及分组统计https://blog.csdn.net/m1729339749/article/details/130034658MongoDB 聚合管道的字段投影https://blog.csdn.net/m1729339749/article/details/130055110这篇我们主要介绍使用聚合管道实现文档操作(排序、跳过、获取、随机抽取、分解):

一、准备工作

初始化零食数据

db.goods.insertMany([
    { "_id": 1,  name: "薯片", size: "S", quantity: 10, price: 8, expirationTime: ISODate( "2023-08-08T00:00:00Z" ) },
    { "_id": 2,  name: "薯片", size: "L", quantity: 8, price: 12, expirationTime: ISODate( "2023-08-08T00:00:00Z" ) },
    { "_id": 3,  name: "牛肉干", size: "L", quantity: 5, price: 30, expirationTime: ISODate( "2023-10-10T00:00:00Z" ) },
    { "_id": 4,  name: "可口可乐", size: "S", quantity: 10, price: 3, expirationTime: ISODate( "2025-01-06T00:00:00Z" ) },
    { "_id": 5,  name: "可口可乐", size: "L", quantity: 6, price: 10, expirationTime: ISODate( "2025-01-06T00:00:00Z" ) },
    { "_id": 6,  name: "旺仔牛奶", size: "L", quantity: 10, price: 5, expirationTime: ISODate( "2023-08-10T00:00:00Z" )}
])

 初始化测试数据

db.test.insertMany(
    [
        { "_id" : "1001", "name" : "张三", "fruits" : [ "apple", "orange" ] },
        { "_id" : "1002", "name" : "李四", "fruits" : [ "banana", "apple" ] },
        { "_id" : "1003", "name" : "王五", "fruits" : [ "banana", "apple", "orange" ] }
    ]
);

二、文档排序($sort)

语法:{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

将文档按照指定字段排序

其中,<field>指的是排序字段

<sort order>指的是排序方式, 1代表正序,-1代表倒序,{ $meta: "textScore" }代表文本分数进行排序,在使用文本搜索的情况下适合使用,此处不再讲解,后面我们用专门的示例对其进行解释。

语法中使用多个排序字段的原因是比较排序时当第一个字段对应的值相等时则使用第二个字段对应的值进行比较排序,依次类推。

例子1:按照零食的价格进行正序排序

db.goods.aggregate([
    { 
        $sort: { "price": 1 } 
    }
])

聚合查询的结果:

{ "_id" : 4, "name" : "可口可乐", "size" : "S", "quantity" : 10, "price" : 3, "expirationTime" : ISODate("2025-01-06T00:00:00Z") }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "quantity" : 10, "price" : 5, "expirationTime" : ISODate("2023-08-10T00:00:00Z") }
{ "_id" : 1, "name" : "薯片", "size" : "S", "quantity" : 10, "price" : 8, "expirationTime" : ISODate("2023-08-08T00:00:00Z") }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "quantity" : 6, "price" : 10, "expirationTime" : ISODate("2025-01-06T00:00:00Z") }
{ "_id" : 2, "name" : "薯片", "size" : "L", "quantity" : 8, "price" : 12, "expirationTime" : ISODate("2023-08-08T00:00:00Z") }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "quantity" : 5, "price" : 30, "expirationTime" : ISODate("2023-10-10T00:00:00Z") }

三、跳过文档($skip)

语法:{ $skip: <positive 64-bit integer> }

跳过N条文档,<positive 64-bit integer>指的是正整数

例子:按照零食的价格进行正序排序,跳过两条零食

db.goods.aggregate([
    { 
        $sort: { "price": 1 },
    },
    {
        $skip: 2
    }
])

 聚合查询的结果:

{ "_id" : 1, "name" : "薯片", "size" : "S", "quantity" : 10, "price" : 8, "expirationTime" : ISODate("2023-08-08T00:00:00Z") }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "quantity" : 6, "price" : 10, "expirationTime" : ISODate("2025-01-06T00:00:00Z") }
{ "_id" : 2, "name" : "薯片", "size" : "L", "quantity" : 8, "price" : 12, "expirationTime" : ISODate("2023-08-08T00:00:00Z") }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "quantity" : 5, "price" : 30, "expirationTime" : ISODate("2023-10-10T00:00:00Z") }

四、获取文档($limit)

语法:{ $limit: <positive 64-bit integer> }

获取N条文档,<positive 64-bit integer>指的是正整数

例子:按照零食的价格进行正序排序,跳过两条零食后,获取两条零食

db.goods.aggregate([
    { 
        $sort: { "price": 1 },
    },
    {
        $skip: 2
    },
    {
        $limit: 2
    }
])

聚合查询的结果:

{ "_id" : 1, "name" : "薯片", "size" : "S", "quantity" : 10, "price" : 8, "expirationTime" : ISODate("2023-08-08T00:00:00Z") }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "quantity" : 6, "price" : 10, "expirationTime" : ISODate("2025-01-06T00:00:00Z") }

五、随机抽取文档($sample)

语法:{ $sample: { size: <positive integer N> } }

从所有文档中随机查询N条文档,N是正整数;

例子:从所有零食中随机抽取2种零食

db.goods.aggregate([
    {
        "$project": {
            "_id": 0,
            "name": 1,
            "size": {
                $cond: {
                    if: { $eq: [ "S", "$size" ] },
                    then: "小包装",
                    else: "大包装"
                }
            }
        }
    },
    {
        "$sample": { size: 2 }
    }
])

解释一下给出的聚合查询语句:

(1) 使用$project对所有的零食进行字段映射,只保留名称和型号两个字段

(2) 随机查询两条文档

执行聚合查询后会随机查询两条文档数据:

{ "name" : "可口可乐", "size" : "小包装" }
{ "name" : "牛肉干", "size" : "大包装" }

【注意】

(1) 随机查询的文档数据不会重复

(2) 如果随机查询的文档数(N)大于文档的总数(M),则只能返回M条文档

六、分解文档($unwind)

语法:{ $unwind: <field path> }

解开数组字段的值,把数组中的每个元素构造成一个文档

<field path>指的是字段路径,使用$ + 字段

例子:获取test集合中的fruits字段分解后的文档

db.test.aggregate([
    {
        $unwind: "$fruits"
    }
])

聚合查询的结果:

{ "_id" : "1001", "name" : "张三", "fruits" : "apple" }
{ "_id" : "1001", "name" : "张三", "fruits" : "orange" }
{ "_id" : "1002", "name" : "李四", "fruits" : "banana" }
{ "_id" : "1002", "name" : "李四", "fruits" : "apple" }
{ "_id" : "1003", "name" : "王五", "fruits" : "banana" }
{ "_id" : "1003", "name" : "王五", "fruits" : "apple" }
{ "_id" : "1003", "name" : "王五", "fruits" : "orange" }

 

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

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

相关文章

COCO数据集相关知识介绍

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;总结链接&#xff1a; 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c;代码直接复制运行即可。包括&#xff1a; &am…

SpringTx 源码解析 - @Transactional 声明式事务执行原理

一、Spring Transactional 声明式事务执行原理 Transactional 是 Spring 框架中用于声明事务的注解&#xff0c;可以标注在方法或类上。当标注在类上时&#xff0c;表示该类的所有public方法都将支持事务。当标注在方法上时&#xff0c;表示该方法将在一个事务内执行。 Trans…

BGP对等体建邻配置

BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种&#xff1a;1、使用物理接口建邻 2、使用环回借口建邻&#xff0c;针对不同的BGP对等体选用不同的建邻方式。 EBGP的建邻主要使用的是物理接口建邻 IBGP的建邻主要使用的是环回接口建邻 这两种建邻方…

VBA的面向接口编程

工作中有时候会用到VBA&#xff08;Visual Basic for Applications&#xff09;&#xff0c;不是很多&#xff0c;也没有专门去学习VBA&#xff0c;用的时候遇到问题就上网去查资料&#xff0c;解决问题了就放下了。 今天被同事问到VBA中类的用法&#xff0c;我从来没有用过&am…

论文解读:基于 OpenMLDB 的流式特征计算优化

近期&#xff0c;数据库领域的顶级学术会议 ICDE 2023 在迪斯尼主题公园的故乡 - 美国的安纳海姆&#xff08;Anaheim&#xff09;举办。由 OpenMLDB 开源社区和新加坡科技设计大学&#xff08;Singapore University of Technology and Design&#xff09;联合完成的研究工作在…

Vue2-黑马(三)

目录&#xff1a; &#xff08;1&#xff09;vue2-axios &#xff08;2&#xff09;axios-发送请求 &#xff08;3&#xff09;vue2-axios-请求体格式 &#xff08;4&#xff09;vue2-axios-默认配置 &#xff08;1&#xff09;vue2-axios 已经配置了代理&#xff0c;可以…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤&#xff1a; 在Linux中安装Git在Linux中安装maven编写shell脚本&#xff08;拉取代码、编译、打包、启动&#xff09;为用户授予执行shell脚本的权限执行shell脚本 执行过程&#xff1a;Linux服务器&#xff08;编译、打包、启动&#x…

每天一道大厂SQL题【Day21】华泰证券真题实战(三)

每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

爱智EdgerOS之深入解析爱智云原生产品ECSM

一、云原生简介 近些年来&#xff0c;云原生逐渐被业界认可和接受&#xff0c;在国内&#xff0c;包括政府、金融、通信、能源在内的众多领域的大型机构和企业都实现了不同程度的云化&#xff0c;那么什么是云原生呢&#xff1f;云原生计算基金会提供了官方的定义&#xff1a;…

参考|雨水情测报和大坝安全监测系统建设方案

解决方案 小型雨水情测报和大坝安全监测系统解决方案&#xff0c;系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成&#xff0c;同时建立规范、统一的监测平台&#xff0c;集数据传输、信息共享、数据储存…

比较系统的学习 pandas (6)

pandas 数据类型转换 在开始数据分析前&#xff0c;有时需要为数据分配好合适的类型&#xff0c;这样才能 够高效地处理数据 # 对所有字段指定统一类型 data pd.DataFrame(data, dtypefloat32) # 对每个字段分别指定 data pd.read_excel(data.xlsx, dtype{name: string, sc…

CUDA和TensorRT入门

CUDA 官方教程&#xff1a;CUDA C Programming Guide (nvidia.com) 一、基础知识 首先看一下显卡、GPU、和CUDA的关系介绍&#xff1a; 显卡、GPU和CUDA简介_吴一奇的博客-CSDN博客 延迟&#xff1a;一条指令返回的时间间隔&#xff1b; 吞吐量&#xff1a;单位时间内处理…

libwebsockets交叉编译

libwebsockets官网&#xff1a;https://libwebsockets.org/ github&#xff1a;https://github.com/warmcat/libwebsockets 首先下载libwebsockets源码&#xff0c;源码既可以在其官网上下载&#xff0c;也可以到github上下载。这里以v4.1.6为例&#xff0c;https://github.co…

react项目中自定义一个markdown编辑器

Markdown 是一种轻量级标记语言。 Markdown是一种简单的格式化文本的方法&#xff0c;在任何设备上看起来都很棒。它不会做任何花哨的事情&#xff0c;比如改变字体大小、颜色或类型——只是基本的&#xff0c;使用你已经知道的键盘符号。 它还允许人们使用易读易写的纯文本格…

为什么众多大型国企都在升级企业数智化底座?

在数字经济大潮中&#xff0c;数字化转型已不是企业的“选修课”&#xff0c;而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中&#xff0c;国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一&#xff0c;数字化能力也成为衡量…

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…

图解并用 C 语言实现非比较排序(计数排序、桶排序和基数排序)

目录 一、计数排序 二、桶排序 三、基数排序 一、计数排序 算法步骤&#xff1a; 找出待排序数组 arr 中的最小值和最大值&#xff08;分别用 min 和 max 表示&#xff09;。 创建一个长度为 max - min 1、元素初始值全为 0 的计数器数组 count。 扫描一遍原始数组&…

Nacos客户端实例注册源码分析-篇一

Nacos客户端实例注册源码分析-篇一 版本 nacos 服务器端 nacos 2.0.3 实例客户端注册入口 注册案例 回到之前搭建的服务提供者项目 9002 &#xff0c;在真实的生产环境下&#xff0c;如果需要让某一个服务注册到 Nacos 的服务当中&#xff0c;我们引入对应的 nacos 发现依赖&…

4月Google Play政策更新,游戏上架需要注意这几点

3月21日&#xff0c;据路透社报道&#xff0c;由于发现国内某知名电商应用存在恶意软件问题&#xff0c;谷歌已暂时将该APP从商店下架&#xff0c;并表示&#xff1a;将该APP下架是一种安全预防措施&#xff0c;已经下载的用户也会收到警告&#xff0c;提示他们进行卸载。 4月…

基于深度学习的动物识别系统(YOLOv5清新界面版,Python代码)

摘要&#xff1a;动物识别系统用于识别和统计常见动物数量&#xff0c;通过深度学习技术检测日常几种动物图像识别&#xff0c;支持图片、视频和摄像头画面等形式。在介绍算法原理的同时&#xff0c;给出Python的实现代码、训练数据集以及PyQt的UI界面。动物识别系统主要用于常…