MongoDB聚合运算符:$setIntersection

MongoDB聚合运算符:$setIntersection

文章目录

  • MongoDB聚合运算符:$setIntersection
    • 语法
    • 使用
    • 举例
      • 元素数组举例
      • 检索授予当前用户角色的文档
        • 创建角色
        • 创建用户
        • 创建集合
        • 使用John登录
        • 检索文档
        • 检查文档
        • 使用Jane登录
        • 检索文档
        • 验证文档

$setIntersection聚合运算符返回两个或多个数组的交集。

语法

{ $setIntersection: [ <array1>, <array2>, ... ] }

字段说明:

参数可以是任何有效的数组表达式。

使用

  • $setIntersection 对数组执行集合操作,将数组视为集合,如果数组包含重复元素,$setIntersection会忽略重复元素,$setIntersection忽略元素的顺序。
  • $setIntersection 过滤掉结果中的重复项,输出仅包含唯一元素的数组,输出数组中元素的顺序未指定。
  • 如果未找到交集(即输入数组不包含公共元素),则 $setIntersection 返回一个空数组。
  • 如果集合包含嵌套数组元素,则 $setIntersection 不会下降到嵌套数组,而处理顶层数组。
例如结果
{ $setIntersection: [ [ "a", "b", "a" ], [ "b", "a" ] ] }[ "b", "a" ]
{ $setIntersection: [ [ "a", "b" ], [ [ "a", "b" ] ] ] }[]

举例

元素数组举例

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

db.flowers.insertMany( [{ "_id" : 1, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ] },{ "_id" : 2, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ] },{ "_id" : 3, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ] },{ "_id" : 4, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ] },{ "_id" : 5, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ] },{ "_id" : 6, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ] },{ "_id" : 7, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ] },{ "_id" : 8, "flowerFieldA" : [ ], "flowerFieldB" : [ ] },{ "_id" : 9, "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ] }
] )

以下操作使用 $setIntersection 运算符返回flowerFieldA 数组和flowerFieldB 数组共有的元素数组::

db.flowers.aggregate([{ $project: { flowerFieldA: 1, flowerFieldB: 1, commonToBoth: { $setIntersection: [ "$flowerFieldA", "$flowerFieldB" ] }, _id: 0 } }]
)

操作返回下面的结果:

{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ], "commonToBoth" : [ "orchid", "rose" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ], "commonToBoth" : [ "orchid", "rose" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ], "commonToBoth" : [ "orchid", "rose" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ], "commonToBoth" : [ "rose" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ], "commonToBoth" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ], "commonToBoth" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ], "commonToBoth" : [ ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ ], "commonToBoth" : [ ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ], "commonToBoth" : [ ] }

检索授予当前用户角色的文档

从 MongoDB 7.0 开始,可以使用新的 USER_ROLES 系统变量来返回用户角色。

下面的例子展示了不同角色的用户对budget集合中的文档具有不同的访问权限。展示了 USER_ROLES 在进行权限检索时的一种用途,budget集合包含的文档中有一个名为 allowedRoles 的字段,在下面的场景中将会看到,可以编写查询,将 allowedRoles 字段中的用户角色与 USER_ROLES 系统变量返回的角色进行比较。

执行以下步骤创建角色、用户和budget集合:

创建角色
db.createRole( { role: "Marketing", roles: [], privileges: [] } )
db.createRole( { role: "Sales", roles: [], privileges: [] } )
db.createRole( { role: "Development", roles: [], privileges: [] } )
db.createRole( { role: "Operations", roles: [], privileges: [] } )
创建用户

创建名为 JohnJane 的用户,并设置所需的角色。

db.createUser( {user: "John",pwd: "jn008",roles: [{ role: "Marketing", db: "test" },{ role: "Development", db: "test" },{ role: "Operations", db: "test" },{ role: "read", db: "test" }]
} )db.createUser( {user: "Jane",pwd: "je009",roles: [{ role: "Sales", db: "test" },{ role: "Operations", db: "test" },{ role: "read", db: "test" }]
} )
创建集合
db.budget.insertMany( [{_id: 0,allowedRoles: [ "Marketing" ],comment: "For marketing team",yearlyBudget: 15000},{_id: 1,allowedRoles: [ "Sales" ],comment: "For sales team",yearlyBudget: 17000,salesEventsBudget: 1000},{_id: 2,allowedRoles: [ "Operations" ],comment: "For operations team",yearlyBudget: 19000,cloudBudget: 12000},{_id: 3,allowedRoles: [ "Development" ],comment: "For development team",yearlyBudget: 27000}
] )

执行以下步骤来检索 John 可以访问的文档:

使用John登录
db.auth( "John", "jn008" )
检索文档

使用系统变量,将 $$ 添加到变量名称的开头。将 USER_ROLES 系统变量指定为 $$USER_ROLES

db.budget.aggregate( [ {$match: {$expr: {$not: {$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]}}}
} ] )

上例从budget集合中返回与运行该示例的用户角色匹配的文档,使用 $setIntersection 返回budget文档 allowedRoles 字段与 $$USER_ROLES 中的用户角色集之间的交集不为空的文档。

检查文档

John 担任营销、运营和开发角色:

[{_id: 0,allowedRoles: [ 'Marketing' ],comment: 'For marketing team',yearlyBudget: 15000},{_id: 2,allowedRoles: [ 'Operations' ],comment: 'For operations team',yearlyBudget: 19000,cloudBudget: 12000},{_id: 3,allowedRoles: [ 'Development' ],comment: 'For development team',yearlyBudget: 27000}
]

执行以下步骤来检索 Jane 可访问的文档:

使用Jane登录
db.auth( "Jane", "je009" )
检索文档

要使用系统变量,可将 $$ 添加到变量名称的开头。将 USER_ROLES 系统变量指定为 $$USER_ROLES

db.budget.aggregate( [ {$match: {$expr: {$not: {$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]}}}
} ] )
验证文档

Jane 具有销售和运营角色:

[{_id: 1,allowedRoles: [ 'Sales' ],comment: 'For sales team',yearlyBudget: 17000,salesEventsBudget: 1000},{_id: 2,allowedRoles: [ 'Operations' ],comment: 'For operations team',yearlyBudget: 19000,cloudBudget: 12000}
]

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

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

相关文章

NX二次开发UF_LAYER(图层相关操作)常用函数

目录 一、概述 二、函数的介绍 2.1 UF_LAYER_ask_category_info &#xff08;查询图层类别信息&#xff09; 2.2 UF_LAYER_ask_category_tag&#xff08;查询图层类别TAG&#xff09; 2.3 UF_LAYER_ask_status&#xff08;查询图层的状态&#xff09; 2.4 UF_LAYER_ask_wo…

在终端使用DOCKER部署ollama

什么是ollama&#xff0c;可以看作管理AI模型的一个命令行工具 ollama -h 可以查看帮助&#xff0c;可以进行删减&#xff0c;下载启动等操作 这里主要使用DOCKER部署ollama&#xff0c;这样即可兼容windows 苹果 Linux 系统 这里我主要介绍在Linux 系统下部署 1. 首先是安…

组件挂载:虚拟DOM如何转化为真实DOM

在React中&#xff0c;当组件首次挂载时&#xff0c;虚拟DOM会被创建并被用来描述组件的UI结构。虚拟DOM是一个JavaScript对象&#xff0c;它是轻量级的、独立于平台的表示。虚拟DOM是React使用的一个重要概念&#xff0c;它允许React在更新UI时更高效地进行比较和渲染操作。 …

docker 报错 error adding seccomp filter rule for syscall clone3

网上有一些说法&#xff0c;例如重新安装docker 但是我自己尝试&#xff0c;用 –security-opt seccompunconfined 就可以&#xff0c;但是需要把这个命令放到紧挨着run的位置&#xff0c;如果放到偏后的位置&#xff0c;可能不起作用。 以下命令是其他网友启动是的命令&…

kaggle使用深度学习的logistic回归方法实现疟疾细胞图像分类

目录 数据集概述 依赖环境 代码概述 导包 数据处理 数据可视化 模型结构搭建 模型迭代训练 初始化和准备 训练过程 评估 模型验证评估 计算准确率 打印分类报告 绘制混淆矩阵 展示 配套数据集与代码下载链接 数据集概述 《疟疾细胞图像数据集》对于医学图像分…

UG10.如何设置鼠标滚轮操作模型放大缩小方向?

UG10.如何设置鼠标滚轮操作模型放大缩小方向呢&#xff1f;看一下具体操作步骤吧。 首先打开UG10.软件&#xff0c;在主菜单栏选择【文件】下拉菜单&#xff0c;选择【实用工具】。 点击【用户默认设置】。 文章源自四五设计网-https://www.45te.com/45545.html 选中【基本环…

Apollo核心原理之眼前一亮

Apollo配置中心的实现原理&#xff0c;apollo的发布配置推送变更消息就是用DeferredResult实现的。它的大概实现步骤如下&#xff1a; apollo客户端会像服务端发送长轮询http请求&#xff0c;超时时间60秒当超时后返回客户端一个304 httpstatus,表明配置没有变更&#xff0c;客…

C++ //练习 13.1 拷贝构造函数是什么?什么时候使用它?

C Primer&#xff08;第5版&#xff09; 练习 13.1 练习 13.1 拷贝构造函数是什么&#xff1f;什么时候使用它? 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 拷贝构造函数是将已有的对象拷贝到正在创建的对象中。当我们需要对…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 查看报错信息 根据报错信息进行修改

Ps 滤镜:波浪

Ps菜单&#xff1a;滤镜/扭曲/波浪 Filter/Distort/Wave 波浪 Wave滤镜可以在图像上创建复杂且可控的波浪形变效果。此滤镜提供了丰富的选项&#xff0c;可以精确调整波浪的形状、大小和分布&#xff0c;以实现不同的视觉效果。 “波浪”滤镜通过对图像应用数学波形函数来扭曲图…

自己写的加密案例4——某东方课程头部sign加密

网址&#xff1a;aHR0cHM6Ly9kc2FwaS54ZGYuY24vcHJvZHVjdC92Mi9jbGFzcy9zZWFyY2g 进行抓包分析&#xff0c;发现请求头中由sign加密&#xff0c;简单判断是消息摘要算法。 Sign:d7c68100ca508bb7c8ae284560754303 进行xhr断点&#xff0c;一下子就发现了位置。 s c.sign&…

linux下 Mysql8.0 离线安装

环境&#xff1a;centos7.9 MysqlL8.0.36安装包 链接&#xff1a;https://pan.baidu.com/s/1bKwHr05z8Ye82dT9tntdUA 提取码&#xff1a;3a5z 参考Centos安装MYSQL8(离线可用) 文章目录 1、解压安装2、配置启动2.1 修改配置文件2.2 mysql 启动 3、mysql 测试 1、解压安装 #…

电子证据的固定方法研究

序言 1.1 背景介绍 在当今数字化时代&#xff0c;网络诈骗已成为全球性的问题&#xff0c;随着互联网的普及和网络经济的发展&#xff0c;诈骗手段不断演化&#xff0c;变得更加隐蔽和复杂。这些诈骗行为不仅对个人和企业造成经济损失&#xff0c;还破坏了网络空间的安全和信任…

单片机 VS 嵌入式LInux (学习方法)

linux 嵌入式开发岗位需要掌握Linux的主要原因之一是&#xff0c;许多嵌入式系统正在向更复杂、更功能丰富的方向发展&#xff0c;需要更强大的操作系统支持。而Linux作为开源、稳定且灵活的操作系统&#xff0c;已经成为许多嵌入式系统的首选。以下是为什么嵌入式开发岗位通常…

Valentina Studio Pro for Mac:强大的数据库管理工具

Valentina Studio Pro for Mac是一款功能全面、操作高效的数据库管理工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户轻松管理各种类型的数据库。 Valentina Studio Pro for Mac v13.10激活版下载 该软件拥有直观的用户界面&#xff0c;使得数据库管理变得简单直观。…

自动驾驶控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

探索数学语言模型的前沿进展——人工智能在数学教育和研究中的应用

数学一直被认为是科学的基石&#xff0c;对于推动技术进步和解决现实世界问题具有重要意义。然而&#xff0c;传统的数学问题解决方式正面临着数字化转型的挑战。MLMs的出现&#xff0c;预示着数学学习和研究方式的一次革命。 MLMs&#xff0c;包括预训练语言模型&#xff08;…

不安全软件,2024 年供应商该如何应对漏洞?

关键在于代码 使用专用工具和系统分析产品代码编写的各个阶段。 与安全研究人员合作 理想情况下&#xff0c;每个供应商都应该有自己持续的漏洞赏金计划&#xff0c;以测试基础设施、软件发布流程和最终产品。这将有助于在真正的攻击发生之前发现漏洞&#xff0c;保护客户。…

2024年深圳杯东三省数学建模联赛赛题浅析

深圳杯&东三省数学建模联赛赛题浅析 赛题难度 一图如下所示 题目复杂性技术需求数据处理主要难点总体评估A题&#xff1a;多个火箭残骸的准确定位222精确处理误差和定位精度1B题&#xff1a;批量工件并行切割下料问题344最大化材料利用率和多动态切割头协调3C题&#xff…

丰田是如何用精益理念改变制造业的?

丰田&#xff0c;这个全球知名的汽车制造商&#xff0c;不仅以其高质量的产品赢得了消费者的信赖&#xff0c;更以其独特的精益理念深刻改变了整个制造业的面貌。那么&#xff0c;丰田究竟是如何用精益理念引领制造业变革的呢&#xff1f;天行健精益管理培训公司解析如下&#…