MongoDB聚合运算符:$bottom

2024-02-26 08:36

本文主要是介绍MongoDB聚合运算符:$bottom,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 语法
    • 用法
      • 关于null和缺失值的处理
      • 举例
      • 查找单个游戏的最后一名
      • 查所有游戏的最后一名

$bottom聚合运算符返回一个指定顺序分组的最后一个元素。

语法

{$bottom:{sortBy: { <field1>: <sort order>, <field2>: <sort order> ... },output: <expression>}
}

字段说明:

字段是否必须描述
sortBy指定结果排序方式,跟$sort一样
output指定分组元素输出的内容,可以是任何合法的表达式

用法

  • $bottom不支持作为聚合表达式。
  • $bottom只支持作为window 操作符
  • 聚合管道调用$bottom受100M的限制,如果单组超过这一限制将报错。

关于null和缺失值的处理

  • $bottom不会过滤掉空值,也就是空值也参与排序
  • $bottom会将缺失值转换为null,也就是缺失值会当做null排序

下面的聚合返回分组中得分最高的文档:

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",playerId:{$bottom:{output: [ "$playerId", "$score" ],sortBy: { "score": -1 }}}}}
] )

在这个例子中:

  • 使用$documents阶段创建了一些字面量(常量)文档,包含了选手的得分
  • $group阶段根据gameId对文档进行了分组,显然文档中的gameId都是G1
  • PlayerD的得分缺失,PlayerE的得分为null,他们的得分都会被当做null处理
  • playerId字段和score字段被指定为输出:["$playerId"," $score"],以数组的形式返回
  • 指定了排序的方式,按照score逆序:sortBy: { "score": -1 }
  • PlayerDPlayerE并列为最后的元素,PlayerD作为最后一个score返回
  • 要解决因为多个元素空值导致的问题,就需要添加更多的字段参与到排序
[{_id: 'G1',playerId: [ [ 'PlayerD', null ] ]}
]

举例

使用下面的命令,创建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 }
])

查找单个游戏的最后一名

使用$bottom查找单场比赛的最后一名:

db.gamescores.aggregate( [{$match : { gameId : "G1" }},{$group:{_id: "$gameId",playerId:{$bottom:{output: [ "$playerId", "$score" ],sortBy: { "score": -1 }}}}}
] )

在本例的管道中:

  • 使用$match阶段用一个gameId对结果进行筛选,即:G1
  • 使用$group阶段依据gameId对结果进行分组,本例中只有一个分组G1
  • 使用output : ["$playerId"," $score"]bottom指定输出字段
  • 使用sortBy: { "score": -1 }按照得分进行逆序排序
  • 使用$bottom返回游戏得分最低的元素

操作返回下面的结果:

[ { _id: 'G1', playerId: [ 'PlayerD', 1 ] } ]

查所有游戏的最后一名

使用$bottom查找所有游戏的最后一名:

db.gamescores.aggregate( [{$group:{ _id: "$gameId", playerId:{$bottom:{output: [ "$playerId", "$score" ],sortBy: { "score": -1 }}}}}
] )

在本例的管道中:

  • 使用$group按照groupId对结果排序
  • 使用$bottom返回所有游戏中得分最低的
  • 使用output : ["$playerId", "$score"]指定bottom输出的字段
  • 使用sortBy: { "score": -1 }按照得分进行逆序排序

操作返回下面的结果:

[{ _id: 'G2', playerId: [ 'PlayerA', 10 ] },{ _id: 'G1', playerId: [ 'PlayerD', 1 ] }
]

这篇关于MongoDB聚合运算符:$bottom的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748270

相关文章

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

【重学 MySQL】十九、位运算符的使用

【重学 MySQL】十九、位运算符的使用 示例检查权限添加权限移除权限 在 MySQL 中,位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用,比如权限管理、状态标记等。 &(位与) 对两个数的二进制表示进行位与操作。只有两个相应的二进制位都为 1 时,结果的该位才为 1,否则为 0。 |(位

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

生产mongodb 分片与集群 方案

链接:http://my.oschina.net/pwd/blog/411439#navbar-header 注:主要是有一键安装的脚本可以借鉴

mongodb基本命令和Java操作API示例

1.Mongo3.2 java API示例:http://www.cnblogs.com/zhangchaoyang/articles/5146508.html 2.MongoDB基本命:http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html 3.java MongoDB查询(一)简单查询: http://www.cnblogs

使用jetty和mongodb做个简易文件系统

使用jetty和mongodb做个简易文件系统 - ciaos 时间 2014-03-09 21:21:00   博客园-所有随笔区 原文   http://www.cnblogs.com/ciaos/p/3590662.html 主题  MongoDB  Jetty  文件系统 依赖库: 1,jetty(提供http方式接口) 2,mongodb的java驱动(访问mo