MongoDB聚合运算符:$firstN

文章目录

$firstN聚合运算符返回分组中前n个元素的聚合,只有在分组元素是有序的情况下才有意义,如果分组中的元素个数小于n,将返回分组中所有的元素。

语法

{$firstN:{input: <expression>,n: <expression>}
}
  • input指定要从文档中获取的字段,可以是任何表达式
  • nn 必须是正整数表达式,可以是常量,也可以是$group_id 值。

使用

空值或缺失值的处理

  • $firstN不会过滤掉空值
  • 缺失的值会被$firstN转换为null

下面的聚合返回每个分组的前5个文档:

db.aggregate( [{$documents: [{ playerId: "PlayerA", gameId: "G1", score: 1 },{ playerId: "PlayerB", gameId: "G1", score: 2 },{ playerId: "PlayerC", gameId: "G1", score: 3 },{ playerId: "PlayerD", gameId: "G1"},{ playerId: "PlayerE", gameId: "G1", score: null }]},{$group:{_id: "$gameId",firstFiveScores:{$firstN:{input: "$score",n: 5}}}}
] )

在这个示例中:

  • documents创建了一些包含运动员得分的字面量文档
  • $group对文档按照gameId对文档进行分组,本例中只有一个gameIdG1
  • PlayerD的得分得分不存在,PlayerE的得分为null,这两者的值都为都会被认为是null
  • input: "$score"指定给firstFiveScores字段并返回一个数组
  • 由于没有排序标准,因此返回前 5 个分数字段
[{_id: 'G1',firstFiveScores: [ 1, 2, 3, null, null ]}
]

f i r s t N 与 firstN与 firstNtopN对比

$firstN$topN运算符返回的结果类似,但是:

  • 如果文档来自于$group且已经排序,应该使用$firstN
  • 如果要排序并且返回前n个元素,使用$topN一个运算就可以搞定
  • $firstN可以用于聚合表达式,但是$topN不可以

关于窗口功能和聚合表达式的支持

  • $firstN支持作为聚合表达式
  • $firstN同时支持作为窗口操作符

内存限制

调用$firstN的聚合管道受100MB的限制,如果单个组超出此限制,聚合将失败并返回错误。

举例

使用下面的脚本创建gamescores集合:

db.gamescores.insertMany([{ playerId: "PlayerA", gameId: "G1", score: 31 },{ playerId: "PlayerB", gameId: "G1", score: 33 },{ playerId: "PlayerC", gameId: "G1", score: 99 },{ playerId: "PlayerD", gameId: "G1", score: 1 },{ playerId: "PlayerA", gameId: "G2", score: 10 },{ playerId: "PlayerB", gameId: "G2", score: 14 },{ playerId: "PlayerC", gameId: "G2", score: 66 },{ playerId: "PlayerD", gameId: "G2", score: 80 }
])

查找单场比赛的前三名运动员得分

使用$firstN单场比赛的前三名得分:

db.gamescores.aggregate( [{$match : { gameId : "G1" }},{$group:{_id: "$gameId",firstThreeScores:{$firstN:{input: ["$playerId", "$score"],n:3}}}}
] )

在本例中:

  • 使用match过滤出gameIdG1的文档
  • 使用$group按照gameId进行分组
  • 使用input : ["$playerId"," $score"].$firstN指定输入字段
  • 使用$fristN指定n:3返回G1游戏前三个文档

操作返回的结果如下:

[{_id: 'G1',firstThreeScores: [ [ 'PlayerA', 31 ], [ 'PlayerB', 33 ], [ 'PlayerC', 99 ] ]}
]

查找多场比赛中前三名运动员的得分

使用$firstN查找每个比赛中前n个输入字段:

db.gamescores.aggregate( [{$group:{_id: "$gameId", playerId:{$firstN:{input: [ "$playerId","$score" ],n: 3}}}}
] )

在本例聚合管道中:

  • 使用$group根据gameId进行分组
  • 使用$firstNn:3返回比赛前三个文档
  • firstN指定输入字段input : ["$playerId", "$score"]

操作返回下面的结果:

[{_id: 'G1',playerId: [ [ 'PlayerA', 31 ], [ 'PlayerB', 33 ], [ 'PlayerC', 99 ] ]},{_id: 'G2',playerId: [ [ 'PlayerA', 10 ], [ 'PlayerB', 14 ], [ 'PlayerC', 66 ] ]}
]

s o r t 与 sort与 sortfirstN一起使用

在管道中较早使用$sort阶段可能会影响$firstN

db.gamescores.aggregate( [{ $sort : { score : -1 } },{$group:{ _id: "$gameId", playerId:{$firstN:{input: [ "$playerId","$score" ],n: 3}}}}] )

在这个例子中:

  • {$sort : { score : -1 } }将得分最高的排在分组最后
  • firstN返回分组中前三个得分最高的
db.gamescores.aggregate( [{ $sort : { score : -1 } },{$group:{ _id: "$gameId", playerId:{$firstN:{input: [ "$playerId","$score" ],n: 3}}}}] )

操作返回下面的结果:

[{_id: 'G2',playerId: [ [ 'PlayerD', 80 ], [ 'PlayerC', 66 ], [ 'PlayerB', 14 ] ]},{_id: 'G1',playerId: [ [ 'PlayerC', 99 ], [ 'PlayerB', 33 ], [ 'PlayerA', 31 ] ]}
]

根据group的键计算n

可以动态的指定n的值,在下面的例子中$cond表达式被用于gameId字段

db.gamescores.aggregate([{$group:{_id: {"gameId": "$gameId"},gamescores:{$firstN:{input: "$score",n: { $cond: { if: {$eq: ["$gameId","G2"] }, then: 1, else: 3 } }}}}}
] )

在本例的管道中:

  • 使用$group根据gameId进行分组
  • 使用input : "$score"指定$firstN输入字段
  • 如果gameIdG2n为1,否则n为3

操作返回下面的结果:

[{ _id: { gameId: 'G1' }, gamescores: [ 31, 33, 99 ] },{ _id: { gameId: 'G2' }, gamescores: [ 10 ] }
]

在聚合表达式中使用$firstN

请看下面的聚合:

db.aggregate( [{$documents: [{ array: [10, 20, 30, 40] } ]},{ $project: {firstThreeElements:{$firstN:{input: "$array",n: 3}}}}
] )
  • $documents创建了一个包含一个数组的字面量文档
  • $project用于返回$firstN的输出
  • _id被输出省略_id:0
  • $firstN使用输入数组[10, 20, 30, 40]
  • 返回输入文档数组的前三个元素

操作返回下面的结果:

[{ firstThreeElements: [ 10, 20, 30 ] }
]

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

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

相关文章

Git中的换行符CRLF和LF问题

目录 第一章、问题分析1.1&#xff09;Git报错提示1.2&#xff09;报错分析 第二章、解决方式2.1&#xff09;在Windows上开发并需要与Unix或macOS上的开发人员协作2.1&#xff09;在Unix或macOS开发并需要与Windows上的开发人员协作2.3&#xff09;不需要与其他操作系统的开发…

【PyTorch】成功解决ModuleNotFoundError: No module named ‘torch’

【PyTorch】成功解决ModuleNotFoundError: No module named ‘torch’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希…

Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

C++笔记:从零开始一步步手撕高阶数据结构AVL树

文章目录 高度平衡二叉搜索树实现一颗AVL树结点与树的描述——定义类AVL树的插入操作步骤1&#xff1a;按照二叉搜索树的方法插入结点步骤2&#xff1a;自底向上调整平衡因子步骤3&#xff1a;触发旋转操作&#xff08;AVL树平衡的精髓&#xff09;右单旋左单旋左右双旋右左双旋…

TSINGSEE青犀视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的各个领域&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;AI的应用正在改变着我们的生活方式。而数据、算法和算力&#xff0c;正是构成…

【矩阵】48. 旋转图像【中等】

旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,…

开源大数据集群部署(十六)Hadoop集群部署(一)

作者&#xff1a;櫰木 按照上文中hadoop集群规划进行安装。 1 HADOOP集群安装 在hd1.dtstack.com主机root权限下安装hadoop集群 解压 [roothd1.dtstack.com software]# tar -zvxf hadoop-3.2.4.tar.gz -C /opt/ [roothd1.dtstack.com software]# chown -R hdfs:hadoop /opt…

基于伪逆的三点法测距,MATLAB源代码(MATLAB函数)

程序介绍 这是一个函数&#xff0c;输入距离和已知点位置&#xff0c;输出未知点的位置。 已知点三个&#xff0c;未知点一个&#xff0c;已知点和未知点的距离也是有三个。 完整源代码 function [p_out] triposition(R_calcu,baseP) % p [5,5;10,9;15,12;20,22;25,3]; %r…

rust学习笔记(1-7)

原文 8万字带你入门Rust 1.包管理工具Cargo 新建项目 1&#xff09;打开 cmd 输入命令查看 cargo 版本 cargo --version2&#xff09; 使用 cargo new 项目名 在文件夹&#xff0c;按 shift 鼠标右键 &#xff0c;打开命令行&#xff0c;运行如下命令&#xff0c;即可创建…

python-1星-可变参数

可变参数是指在函数调用时&#xff0c;可以传入任意数量的参数。 在Python中&#xff0c;可用*args表示可变参数&#xff0c;args是一个元组类型&#xff0c;存储了传入的所有参数。 1、1个星&#xff08;*&#xff09;说明&#xff1a; 1&#xff09;单星号 2&#xff09;…

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

5.82 BCC工具之tcpdrop.py解读

一,工具简介 tcpdrop工具打印被内核丢弃的 TCP 数据包或段的详细信息,包括导致丢弃的内核堆栈跟踪。 当网络出现拥堵、资源不足或其他原因导致数据包被内核丢弃时,tcpdrop可以帮助开发者和网络管理员识别并定位问题。 该工具通过钩住内核中处理TCP数据包的相关函数,捕获…

【使用postman测试python接口】

打开python服务 设置postman如下&#xff0c;并发送&#xff1a; postman新建请求设置请求方式为post设置地址、raw、json方式、内容如下 结果&#xff1a; python如下&#xff1a; from flask import Flask, request, jsonifyapp Flask(__name__) # 实例化对象app.route…

你为什么是你,而不是别人?认识人格的力量

你为什么是你&#xff0c;而不是别人&#xff1f;让你做自我介绍&#xff0c;你会怎么描述自己呢&#xff1f; 人格心理学是心理学的一门重要分支学科。探求、描述和揭示个体思想、情绪及行为的独特模式&#xff0c;综合个人与环境诸多影响因素&#xff0c;对现实社会中的个人作…

Vite为什么比Webpack快

一、引言 主流的前端构建工具包括以下几种&#xff1a; Webpack&#xff1a;当下最热门的前端资源模块化管理和打包工具。它能够将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。同时&#xff0c;Webpack还支持代码分割&#xff0c;可以按需加载模块&#…

Redis底层数据结构之String

文章目录 1. 前提回顾2. RedisObject三大数据类型简介3. SDS字符串4. SDS字符串源码分析5. 总结 1. 前提回顾 前面我们说到redis的String数据结构在底层有多种编码方式。例如我们执行下面两条语句 set k1 v1 set age 17我们查看类型&#xff0c;发现这类型都是String类型 我们…

docker desktop 启动失败

docker desktop 启动失败 1.如果直接启动报错&#xff0c;设置 2.如果启动报 Failed to set version to docker-desktop: exit code: -1的解决方法. netsh winsock reset

vue3+Ts项目按需引入Echarts,并封装成hooks

记录 vue3Ts 项目中&#xff0c;按需引入echarts并进行二次封装使用。 1、安装&#xff1a;npm i echarts 2、新增按需引入配置文件&#xff1a;echartsConfig.ts // 引入 echarts 核心模块&#xff0c;核心模块提供了 echarts 使用必须要的接口。 import * as echarts from …

3.Windows下安装MongoDB和Compass教程

Windows下安装MongoDB 总体体验下来&#xff0c;&#xff0c;要比MySQL的安装简单了许多&#xff0c;没有过多的配置&#xff0c;直接就上手了&#xff01; 1、下载 进入官方的下载页面https://www.mongodb.com/try/download/community&#xff0c;如下选择&#xff0c;我选…

第七节:使用SMB发布Web前端程序

一、概述 一直以来&#xff0c;多数人都使用Apache、IIS、Tomcat等开源或商业Web服务器来运行Web程序&#xff0c;各种参数太多&#xff0c;与我们简单易用逻辑相左。所以在架构设计的时候&#xff0c;我们也在考虑&#xff0c;我们公司的Web程序是否能运行在SMB中&#xff0c;…