MongoDB聚合:$facet

对输入的文档执行多个聚合管道,在输出结果中,每个子管道一个字段,字段值是一个文档数组。

$facet可以在一个阶段创建多面聚合,横跨多个维度或方面来描述数据特征。多面聚合可提供多个过滤器和分类指导数据浏览和分析。

$facet 阶段在单个聚合阶段内创建多面聚合,通过多个维度或面来描述数据特征。多面聚合提供了多个过滤器和分类,为数据浏览和分析导航,零售商通常通过创建产品价格、制造商、尺寸等方面的过滤器以及使用分面来缩小搜索范围。

输入文件只传递给$facet阶段一次。$facet可对同一组输入文档进行各种聚合,而无需多次检索输入文档。

语法

$facet阶段使用方法如下:

{ $facet:{<outputField1>: [ <stage1>, <stage2>, ... ],<outputField2>: [ <stage1>, <stage2>, ... ],...}
}

使用

  • 注意,$facet的每个阶段执行时,返回文档大小不能超过100M,而且由于$facet不能缓存到磁盘,所以即使指定了allowDiskUse标志也没用。

  • 指定下面任何一个方面相关的阶段在不同的$facet子管道的<stage去执行一个已多方面的聚合.

    • $bucket
    • $bucketAuto
    • $sortByCount
  • 下面阶段中不能使用$facet

    • $collStats
    • $facet
    • $geoNear
    • $indexStats
    • $out
    • $merge
    • $planCacheStats
  • $facet的所有子管道都传递完全相同的输入文档,这些子管道彼此独立,每个子管道输出的文档数组都存储在各自的字段中。另外,一个子管道的输出不能用作同一个$facet阶段内其它子管道的输入。如果需要进一步聚合,可以在$facet后面添加其他阶段。

  • $facet 中的每个子管道都会传递完全相同的输入文档集。这些子流水线彼此完全独立,每个子流水线输出的文档数组都存储在输出文档的不同字段中。一个子管道的输出不能用作同一 $facet 阶段内不同子管道的输入。如果需要进一步聚合,可以在\$facet的后面添加其他阶段,并指定所需次级管道输出的字段名称 <outputField>

  • 管道的顺序决定了$facet使用索引:

    • 如果$facet是管道的第一个阶段,将会执行COLLSCAN,不会使用索引。
    • 如果$facet在其他阶段之后,并且先前的阶段已经使用了索引,则$facet在执行的时候不会触发COLLSCAN。比如,如果$match$sort阶段在$facet之前,则$facet使用索引并且不会触发COLLSCAN

举例

以下在线艺术品商店库存中存在以下的艺术藏品:

{ "_id" : 1, "title" : "The Pillars of Society", "artist" : "Grosz", "year" : 1926,"price" : NumberDecimal("199.99"),"tags" : [ "painting", "satire", "Expressionism", "caricature" ] }
{ "_id" : 2, "title" : "Melancholy III", "artist" : "Munch", "year" : 1902,"price" : NumberDecimal("280.00"),"tags" : [ "woodcut", "Expressionism" ] }
{ "_id" : 3, "title" : "Dancer", "artist" : "Miro", "year" : 1925,"price" : NumberDecimal("76.04"),"tags" : [ "oil", "Surrealism", "painting" ] }
{ "_id" : 4, "title" : "The Great Wave off Kanagawa", "artist" : "Hokusai","price" : NumberDecimal("167.30"),"tags" : [ "woodblock", "ukiyo-e" ] }
{ "_id" : 5, "title" : "The Persistence of Memory", "artist" : "Dali", "year" : 1931,"price" : NumberDecimal("483.00"),"tags" : [ "Surrealism", "painting", "oil" ] }
{ "_id" : 6, "title" : "Composition VII", "artist" : "Kandinsky", "year" : 1913,"price" : NumberDecimal("385.00"),"tags" : [ "oil", "painting", "abstract" ] }
{ "_id" : 7, "title" : "The Scream", "artist" : "Munch", "year" : 1893,"tags" : [ "Expressionism", "painting", "oil" ] }
{ "_id" : 8, "title" : "Blue Flower", "artist" : "O'Keefe", "year" : 1918,"price" : NumberDecimal("118.42"),"tags" : [ "abstract", "painting" ] }

下面的操作使用MongoDB的分面功能,为客户提供按标签、价格和创建年份等多个维度分类的商店库存。$facet阶段有三个子管道,分别使用$sortByCount$bucket$bucketAuto来执行多面聚合。输入文档只在操作开始时从数据库中获取一次:

db.artwork.aggregate( [{$facet: {"categorizedByTags": [{ $unwind: "$tags" },{ $sortByCount: "$tags" }],"categorizedByPrice": [//过滤掉缺失价格的文档 如:_id: 7的文档{ $match: { price: { $exists: 1 } } },{$bucket: {groupBy: "$price",boundaries: [  0, 150, 200, 300, 400 ],default: "Other",output: {"count": { $sum: 1 },"titles": { $push: "$title" }}}}],"categorizedByYears(Auto)": [{$bucketAuto: {groupBy: "$year",buckets: 4}}]}}
])

操作返回结果:

{"categorizedByYears(Auto)" : [// 第一个桶包括不带年份的文件,如:_id: 4{ "_id" : { "min" : null, "max" : 1902 }, "count" : 2 },{ "_id" : { "min" : 1902, "max" : 1918 }, "count" : 2 },{ "_id" : { "min" : 1918, "max" : 1926 }, "count" : 2 },{ "_id" : { "min" : 1926, "max" : 1931 }, "count" : 2 }],"categorizedByPrice" : [{"_id" : 0,"count" : 2,"titles" : ["Dancer","Blue Flower"]},{"_id" : 150,"count" : 2,"titles" : ["The Pillars of Society","The Great Wave off Kanagawa"]},{"_id" : 200,"count" : 1,"titles" : ["Melancholy III"]},{"_id" : 300,"count" : 1,"titles" : ["Composition VII"]},{//包含桶边界外的文档的价格 如:_id: 5"_id" : "Other","count" : 1,"titles" : ["The Persistence of Memory"]}],"categorizedByTags" : [{ "_id" : "painting", "count" : 6 },{ "_id" : "oil", "count" : 4 },{ "_id" : "Expressionism", "count" : 3 },{ "_id" : "Surrealism", "count" : 2 },{ "_id" : "abstract", "count" : 2 },{ "_id" : "woodblock", "count" : 1 },{ "_id" : "woodcut", "count" : 1 },{ "_id" : "ukiyo-e", "count" : 1 },{ "_id" : "satire", "count" : 1 },{ "_id" : "caricature", "count" : 1 }]
}

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

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

相关文章

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC

Debezium日常分享系列之&#xff1a;Debezium2.5版本之connector for JDBC 一、概述二、JDBC 连接器的工作原理三、使用复杂的 Debezium 变更事件四、至少一次交付五、多项任务六、数据和列类型映射七、主键处理八、删除模式九、幂等写入十、Schema evolution十一、引用和区分大…

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台&#xff0c;是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入&#xff0c;通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据&#xff0c;支持无插件H5直播…

RK3568平台 input输入子系统

一.input子系统简介 Input 子系统是管理输入的子系统&#xff0c; 和 pinctrl 和 gpio 子系统一样&#xff0c; 都是 Linux 内核针对某一类设备而创建的框架。 input 子系统处理输入事务&#xff0c; 任何输入设备的驱动程序都可以通过 input 输入子系统提供的接口注册到内核&…

Java虚拟机介绍

JVM是一种用于计算设备的规范&#xff0c;它是一个虚拟出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟计算机的各个功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。每个Java虚拟机都着一个清晰的任务&#x…

用通俗易懂的方式讲解大模型:在 CPU 服务器上部署 ChatGLM3-6B 模型

大语言模型&#xff08;LLM&#xff09;的量化技术可以大大降低 LLM 部署所需的计算资源&#xff0c;模型量化后可以将 LLM 的显存使用量降低数倍&#xff0c;甚至可以将 LLM 转换为完全无需显存的模型&#xff0c;这对于 LLM 的推广使用来说是非常有吸引力的。 本文将介绍如何…

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1&#xff09;案例需求&#xff1a; 使用 Flume 监听一个端口&#xff0c;收集该端口数据&#xff0c;并打印到控制台。 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;安装 netcat 工具 sudo yum …

SVN服务端的下载、安装

地址 &#xff1a; Apache Subversion Binary Packages 下载 点击 VisualSVN 安装 都是点击 next 点击next &#xff0c;即可安装成功

SpringBoot学习(三)-员工管理系统开发(重在理解)

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 本文是基于狂神老师SpringBoot教程中的员工管理系统从0到1的实践和理解。该系统应用SpringB…

B端产品经理学习-需求挖掘

B端产品需求挖掘 目录 识别和管理干系人 决策人和负责人需求挖掘 针对用户进行需求挖掘 用户访谈结果整理 B端产品的需求来源是非常复杂的&#xff0c;要考虑多个方面&#xff1b;如果你是一个通用性的产品&#xff0c;要考虑市场、自身优劣势、干系人。而定制型B端产品会…

uniapp:签字版、绘画板 插件l-signature

官方网站&#xff1a;LimeUi - 多端uniapp组件库 使用步骤&#xff1a; 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后&#xff0c;在项目中的uni_modules目录 3、最后 没有其它步骤&#xff0c;直接官网代码复制到vue文件中就可以了&#xff0c…

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道&#xff0c;app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦&#xff0c;动不动就是用appium写代码脚本维护什么的&#xff0c;不仅步骤繁琐&#xff0c;环境配置方面也是繁琐无比&#xff0c;动不动就与客户…

mysql在left join后的where条件里过滤join表将变为inner join

sql1&#xff1a;此时是正常的左连接 select user.name,dept.dept_name from user left join dept on dept.id user.dept_id and dept.is_deletedN where user.is_deleteN此时将返回全部user并附带所属的单位&#xff08;有可能有些user没有dept&#xff09; 那假如想查出单位…

策略模式+责任链模式配合Nacos实现参数校验链

1、业务场景 在SpringBoot项目中&#xff0c;针对接收的参数信息&#xff0c;根据需求要进行以下校验&#xff1a; 校验客户的apikey是否合法&#xff1b;校验请求的ip地址是否是白名单&#xff1b;校验短信的签名&#xff1b;校验短信的模板&#xff1b;校验手机号的格式合法…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件&#xff1a; 电量 库伦&…

多模态——旷视大模型Vary更细粒度的视觉感知实现文档级OCR或图表理解

概述 现代大型视觉语言模型&#xff08;LVLMs&#xff09;&#xff0c;例如CLIP&#xff0c;使用一个共同的视觉词汇&#xff0c;以适应多样的视觉任务。然而&#xff0c;在处理一些需要更精细和密集视觉感知的特殊任务时&#xff0c;例如文档级OCR或图表理解&#xff0c;尤其…

前缀和算法 -- 寻找数组的中心坐标

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 输入描述 给定一个数组&#xff0c;接口为int pivotIndex(vector<int>& nums) 输出描述 我们以示例1为例画图解释&#xf…

十二、Seata的⾼可⽤

目录 11.1. mysql存储数据11.2 整合注册中心1、为什么要整合注册中心 &#xff1f;2、windows版seata整合nacos 11.1. mysql存储数据 11.2 整合注册中心 1、为什么要整合注册中心 &#xff1f; 现在我们只有⼀个seata 客户端配置seata.service.grouplist.default127.0.0.1:8…

DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证…

频谱论文:约束飞行轨迹下基于生成对抗网络的三维无线电地图重构

#频谱# T. Hu, Y. Huang, J. Chen, Q. Wu and Z. Gong, "3D Radio Map Reconstruction Based on Generative Adversarial Networks Under Constrained Aircraft Trajectories," in IEEE Transactions on Vehicular Technology, vol. 72, no. 6, pp. 8250-8255, June …

css样式中设置height: calc(100vh-50px)不生效

在CSS中&#xff0c;100vh 表示视口&#xff08;viewport&#xff09;的高度。视口是指浏览器窗口中可见内容的区域&#xff0c;即用户能够看到的网页部分。 100vh 表示视口高度的百分比&#xff0c;具体数值取决于当前浏览器窗口的高度。例如&#xff0c;如果浏览器窗口的高度…