MongoDB聚合运算符:$maxN

文章目录

    • 语法
    • 使用
    • 举例
      • 找出一个项目中前三名的得分
      • 查找多个比赛项目中得分最高的三个
      • 基于$group分组的Key计算n

$maxN聚合运算符用于返回聚合分组中最大的n个元素,如果分组中的元素数量小于n,则返回分组的全部元素。

语法

{$maxN:{input: <expression>,n: <expression>}
}

参数说明:

  • input:指定输入表达式,表达式用于对分组中的每个元素计算后,$maxN保留最大的n个值。
  • n:用于指定每个分组中要返回的成员数量,n必须是正整数,可以是常量或者依赖于分组内的_id值。

使用

空和缺失值的处理

  • $maxN会过滤掉空值和缺失值

下面的聚合返回分组中最大的n个文档:

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",maximumThreeScores:{$maxN:{input: "$score",n: 4}}}}
] )

在这个例子中:

  • $document 创建了一个常量文档,包含了运动员的得分
  • $group 根据gameId对文档进行分组,例子中只有一个gameIdG1
  • PlayerD 的得分缺失,PlayerE的得分为空,这些值都被视为空
  • $maxNinput:"$score"返回一个数组放在maximumThreeScores字段
  • 尽管n=4,但因为只有3个文档有得分,$maxN只返回得分最高的3个
[{_id: 'G1',maximumThreeScores: [ 3, 2, 1 ]}
]

m a x N 和 maxN和 maxNtopN

$maxN$topN这两个运算符可以得到相同的结果,通常的:

  • 如果想要在没有排序的文档中取最大的前几个值,使用$maxN会更有优势。
  • 如果需要保证特定的顺序,还是需要用$topN
  • 如果不打算对输出值进行排序,可以使用$maxN

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

  • $maxN可以被用作累加器
  • $maxN也支持作为聚合表达式
  • $maxN同时也支持作为窗口运算符

关于内存的限制

在聚合管道中使用$maxN时,受100M的限制,如果单个分组唱过这一限制,聚合将报错。

举例

使用下面的脚本创建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 }
])

找出一个项目中前三名的得分

下面的聚合使用$maxN找出一个项目中前三名的得分

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

在这个例子中:

  • 使用$match筛选出gameIdG1的项目
  • 使用$group根据gameId进行分组,本例中只有一个分组G1
  • 使用input : ["$score","$playerId"]$maxN指定输入字段
  • 使用$maxN返回G1比赛项目中得分最高的三个元素

结果如下:

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

查找多个比赛项目中得分最高的三个

下面的聚合使用$maxN在所有项目中,查找n个得分最高的

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

本例中:

  • 使用$group依据gameId进行分组
  • 使用$maxN返回所有项目中得分最高的3个
  • 使用input:["$score","$playerId"]$maxN指定输入字段

返回结果如下:

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

基于$group分组的Key计算n

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

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

本例中:

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

操作返回结果:

[{ _id: { gameId: 'G2' }, gamescores: [ [ 80, 'PlayerD' ] ] },{_id: { gameId: 'G1' },gamescores: [ [ 99, 'PlayerC' ], [ 33, 'PlayerB' ], [ 31, 'PlayerA' ] ]}
]

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

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

相关文章

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里&#xff0c;我们需要整理一下之前学习的epoll模型&#xff0c;并根据之前的epoll模型&#xff0c;提出弊端&#xff0c;进而整理epoll反应堆模型&#xff0c;进一步深刻理解&#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

CSS - 你实现过0.5px的线吗

难度级别:中级及以上 提问概率:75% 我们知道在网页显示或是网页打印中,像素已经是最小单位了,但在很多时候,即便是最小的1像素,精度却不足以呈现所需的线条精度和细节。因此,为了在网页显示和网页打印中呈现更加细致的线条,为了在视觉…

Prometheus+grafana环境搭建Nginx(docker+二进制两种方式安装)(六)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前五篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

自动驾驶涉及相关的技术

当科幻走进现实&#xff0c;当影视照进生活&#xff0c;无数次憧憬的自动驾驶&#xff0c;正在慢慢的梦想成真。小时候天马星空的想象&#xff0c;现在正悄无声息的改变着我们的生活。随着汽车电动化进程的加快&#xff0c;自动驾驶技术映入眼帘&#xff0c;很多人可能感觉遥不…

逐步学习Go-sync.Once(只执行一次)Exactly Once

sync.Once简介 sync.Once 是一个会执行且仅执行一次动作的对象。该对象在第一次使用后不能再被复制。 在 Go 内存模型的术语中&#xff0c;sync.Once 的 Do 方法中的函数 f 返回的操作&#xff0c;相对于任何对 once.Do(f) 的调用返回的操作&#xff0c;都具有“同步优先”的…

Jupyter Notebook安装使用(一)

1. 简介 Jupyter Notebook 是一个非常强大的工具&#xff0c;它允许用户创建和共享包含实时代码、方程式、可视化和叙事文本的文档。这种工具特别适合数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等多种应用领域。 2. 安装Jupyter Notebook 2.1. 使用 Anaconda…

Java面试题:请解释Java中的多线程编程?

Java中的多线程编程允许 concurrently 执行多个线程&#xff0c;从而可以同时执行多个任务&#xff0c;提高程序的效率和响应性。在Java中&#xff0c;线程可以通过以下两种主要方式来实现&#xff1a; 继承 Thread 类实现 Runnable 接口 继承 Thread 类 class MyThread ext…

Gson的用法

1. 导入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version> </dependency> 2. 使用Gson进行解析 2.1 Gson解析普通对象 package com.jiang.partnetbackend.…

利用Idea实现Ajax登录(maven工程)

一、新建一个maven工程&#xff08;不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客&#xff09;&#xff0c;工程目录如图 ​​​​​​​ js文件可以上up网盘提取 链接&#xff1a;https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…

Chatgpt掘金之旅—有爱AI商业实战篇|专业博客|(六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业博客领域有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技…

ABBYY FineReader15免费电脑OCR图片文字识别软件

产品介绍&#xff1a;ABBYY FineReader 15 OCR图片文字识别软件 ABBYY FineReader 15是一款光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专门设计用于将扫描的文档、图像和照片中的文本转换成可编辑和可搜索的格式。这款软件利用先进的OCR技术&#xff0c;能够识别…

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

微信小程序短链接工具推荐

现在微信小程序大行其道&#xff0c;但工作中大部分人选择了短链接的方式来推广微信小程序&#xff0c;那么微信小程序短链接工具哪个好?今天就分享一篇从网上看到的关于《微信小程序短链接工具推荐》文&#xff0c;作者是souki&#xff0c;一起来看看吧! 一、缩链 1、生成方…

MongoDB聚合运算符:$maxN(用于数组)

文章目录 语法使用举例 $maxN聚合运算符返回数组中最大的n个值。 语法 { $maxN: { n: <expression>, input: <expression> } }参数说明&#xff1a; n&#xff1a;正整数表达式&#xff0c;用于指定返回数组元素的数量。input&#xff1a;可以解析为数组的表达式…

Memcached 教程之 PHP 连接 Memcached 服务(十)

PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务&#xff0c;接下来我们为大家介绍 PHP 如何使用 Memcached 服务。 PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址&#xff1a;PECL :: Package :: memcache&#xff0c;你可以下载最新稳定…

【VASP学习】在Ubuntu系统安装vasp.5.4.4的全过程(包括VASP官方学习资料、安装过程中相关编辑器的配置、VASP的编译及VASP的测试)

在Ubuntu系统安装vasp.5.4.4的全过程 VASP的简介与相关学习资料安装前的准备工作及说明安装过程intel编译器的安装VASP的编译VASP的测试 参考来源 VASP的简介与相关学习资料 VASP(Vienna Ab initio Simulation Package)是基于第一性原理对原子尺度的材料进行模拟计算的软件。比…

【Linux】线程概念及线程互斥

目录 线程概念 线程优点 线程缺点 线程异常 线程系统编程接口 线程创建及终止 线程等待 使用线程系统接口封装一个小型的C线程库并实现一个抢票逻辑 线程互斥 互斥量的接口 线程互斥实现原理 使用系统加锁接口封装LockGuard 实现自动化加锁 线程安全和可重入函数 …

css:img引入svg后修改颜色

<img class"group-icon" :class"group.opened ? group-icon-active : ":src"require(/assets/icon/ group.icon .svg)" /> // 默认样式 .group-icon {width: 16px;height: 16px;position: relative;left: -1000px;filter: drop-shadow…

HTML1:html基础

HTML 冯诺依曼体系结构 运算器 控制器 存储器 输入设备 输出设备 c/s(client客户端) 客户端架构软件 需要安装,更新麻烦,不跨平台 b/s(browser浏览器) 网页架构软件 无需安装,无需更新,可跨平台 浏览器 浏览器内核: 处理浏览器得到的各种资源 网页: 结构 HTML(超…

【Rust】生命周期

Rust 生命周期机制是与所有权机制同等重要的资源管理机制。 之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对待复杂类型时必不可少的机制&#xff0c;毕竟复杂类型的数据不能被处理器轻易地复制和计算。 但引用往往导致极其复杂的资源管理问题&#x…