MongoDB聚合: $redact

$redact阶段可以根据文档本身存储的信息,限制输出整个文档或文档中的内容。

语法

{ $redact: <expression> }

使用

参数可以是任何有效的表达式,只要能被解析为$$DESCEND$$PRUNE$$KEEP系统变量即可。

$$DESCEND

$redact返回当前文档级别的字段,不包括嵌入文档。若要包含嵌入文档和数组中的嵌入文档,需要对嵌入文档应用$cond表达式,以确定这些嵌入文档的访问权限。

$$PRUNE

$redact排除当前/嵌入文档级别的所有字段,无需进一步检查任何排除字段,即使排除的字段包含可能具有不同访问级别的嵌入文档。

$$KEEP

$redact返回或保留当前/嵌入文档级别的所有字段,而无需进一步检查该级别的字段。即使包含的字段包含可能具有不同访问级别的嵌入文档。

举例

评估每个文档级别的访问权限

forecasts集合包含以下形式的文档,其中tags字段列出了该文档/嵌入式文档级别的不同访问值;例如,[ "G"、"STLW" ]表示"G""STLW"可以访问数据:

{_id: 1,title: "123 Department Report",tags: [ "G", "STLW" ],year: 2014,subsections: [{subtitle: "Section 1: Overview",tags: [ "SI", "G" ],content:  "Section 1: This is the content of section 1."},{subtitle: "Section 2: Analysis",tags: [ "STLW" ],content: "Section 2: This is the content of section 2."},{subtitle: "Section 3: Budgeting",tags: [ "TK" ],content: {text: "Section 3: This is the content of section 3.",tags: [ "HCS" ]}}]
}

用户有权查看"STLW"或"G"的信息,要对该用户2014年的所有文档进行查询,可以在查询时加入$redact阶段:

var userAccess = [ "STLW", "G" ];
db.forecasts.aggregate([{ $match: { year: 2014 } },{ $redact: {$cond: {if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] },then: "$$DESCEND",else: "$$PRUNE"}}}]
);

聚合操作返回下面"编辑后"的文档:

{"_id" : 1,"title" : "123 Department Report","tags" : [ "G", "STLW" ],"year" : 2014,"subsections" : [{"subtitle" : "Section 1: Overview","tags" : [ "SI", "G" ],"content" : "Section 1: This is the content of section 1."},{"subtitle" : "Section 2: Analysis","tags" : [ "STLW" ],"content" : "Section 2: This is the content of section 2."}]
}

排除指定级别的所有字段

accounts集合有下列文档:

{_id: 1,level: 1,acct_id: "xyz123",cc: {level: 5,type: "yy",num: 000000000000,exp_date: ISODate("2015-11-01T00:00:00.000Z"),billing_addr: {level: 5,addr1: "123 ABC Street",city: "Some City"},shipping_addr: [{level: 3,addr1: "987 XYZ Ave",city: "Some City"},{level: 3,addr1: "PO Box 0123",city: "Some City"}]},status: "A"
}

在这个示例文档中,level字段决定了查看数据所需的访问级别。

要在状态为A的所有文档上运行查询,并排除级别为5的文档/嵌入式文档中包含的所有字段,可在查询时加入$redact阶段,在then字段中指定系统变量"$$PRUNE"

db.accounts.aggregate([{ $match: { status: "A" } },{$redact: {$cond: {if: { $eq: [ "$level", 5 ] },then: "$$PRUNE",else: "$$DESCEND"}}}]
);

$redact阶段会评估level字段以确定访问权限,如果level字段等于5,则排除该级别的所有字段,即使排除的字段包含可能具有不同级别值的嵌入文档,如shipping_addr字段。

聚合操作会返回下面的文档:

{"_id" : 1,"level" : 1,"acct_id" : "xyz123","status" : "A"
}

结果显示$redact阶段排除了整个cc字段,包括shipping_addr字段,该字段包含的嵌入文档的级别字段值等于3而不是5

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

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

相关文章

Windows Server 2019 DHCP服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DHCP服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 1)实验服务器配置和客户端 2)实验环境 2.服务器配置 ​编辑 文章目录 Windows Server 2003 Web服务器搭建Windows Server 2003 FTP服务器搭建Windows S…

深度优先搜索、广度优先搜索

搜索 搜索就是采用直接遍历整个状态空间的方式寻找答案的一类算法。根据遍历状态空间&#xff08;图&#xff09;方式的不同&#xff0c;可分为&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 适合树形状态空间&#xff0c;因为递归本身就会产生树的结构&#xff0c;可…

Leetcode 236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

在微信视频号上发表视频

我们手机打开微信 然后 最下面选择 发现 然后点击 上面的视频号 进入后 点击 右上角头像图标 然后 进入个人管理界面 左下角选择 发表视频 然后 进入一个录制界面 我们左下角 点击这个 从相册选择 打开相册后 选择自己需要的视频 然后 点击右下角下一步 觉得内容没问题 就…

Lua编译与运行

lua会首先把代码编译成中间码然后执行&#xff0c;或许大家都有所困惑&#xff1a;它不是解释性语言吗&#xff1f;其实lua作为解释性语言的意义在于其能在运行过程中完成编译工作&#xff0c;正是dofile、loadfile、require这种函数的存在&#xff0c;lua才能顺理成章地称自己…

VUE基础知识(JAVA后端入门篇)

VUE基础知识&#xff08;JAVA后端入门篇&#xff09; Vue是一套前端框架&#xff0c;免除原生JavaScriptr中的DOM操作&#xff0c;简化书写基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上Vue.js - 渐进式 JavaScrip…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

51单片机编程基础(C语言):电子时钟(LED1602作为显示)

题目要求&#xff1a; 审题时这个题是用数码管来显示的&#xff0c;数码管显示时钟我完成了一个&#xff0c;只是要求跟他不一样&#xff0c;所以这次想用LCD1602来显示&#xff0c;所以我先用LCD1602完成&#xff0c;再用数码管完成&#xff08;其实也只要在我之前的项目基础…

如何学习机器学习和深度学习: 软件工程师指南

一、简介 人工智能这个主题激发了我的兴趣&#xff0c;我一直在这个领域中不断学习和尝试新事物。 众所周知&#xff0c;与自然语言处理、计算机视觉等相关的技术已经出现并发展成为每天被数百万用户使用的解决方案。 尽管人们使用“人工智能”这一术语&#xff0c;但我们离…

[计算机网络]---网络编程套接字

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

C++ //练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。

C Primer&#xff08;第5版&#xff09; 练习 6.7 练习 6.7 编写一个函数&#xff0c;当它第一次被调用时返回0&#xff0c;以后每次被调用返回值加1。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…

如何将字体添加到 ONLYOFFICE 文档服务器 8.0

作者&#xff1a;VincentYoung 阅读本文&#xff0c;了解如何为自己的在线办公软件 ONLYOFFICE 文档服务器的字体库添加字体 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书…

无人机竞赛视觉算法开发流程开源计划(询问大家意见)

本科中参加过一系列的无人机机器人竞赛&#xff0c;像电赛、工训赛、机器人大赛这些&#xff0c;有一些比较常用的方案打算开源一下。现在读研了&#xff0c;也算是对本科的一个总结&#xff0c;但是还是想看看大家意见&#xff0c;大家有什么需求可以在评论区说&#xff0c;我…

EsayExcel文件导入导出

目录 准备工作 监听器类 导入测试 导出测试 上传Excel 下载Excel 混合导出模板导出 headRowNumber(1)&#xff1a;从第几行开始读 准备工作 导入依赖 <!--easyexcel--> <dependency><groupId>com.alibaba</groupId>x<artifactId>easye…

QTabWidget和QTabBar控件样式设置(qss)

QTabWidget和QTabBar控件样式设置 1、QTabWidget样式可自定义的有哪些示例&#xff1a;效果图 2、QTabBar样式可自定义的有哪些示例效果图 1、QTabWidget样式可自定义的有哪些 QTabWidget::pane{} 定义tabWidgetFrameQTabWidget::tab-bar{} 定义TabBar的位置QTabWidget::tab{}定…

简单的手指控制机械臂

跟之前的那个项目类似, 使用mediapipe, 拿到手指的位置, 来控制舵机, 从而控制一个机械臂. 直接上代码: """ 演示一个简单的虚拟拖拽 步骤&#xff1a; 1、opencv 读取视频流"""# 导入opencv import cv2 import numpy as np import math impor…

c++STL系列——(八)multiset

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;multiset是一个非常有用的容器&#xff0c;和set容器类似&#xff0c;用于存储一组按照特定顺序排列的元素。与set不同的是&#xff0c;multiset允许重复元素的存在。本文将详细介绍multiset容器的特点、用法以及一些…

基于物联网的实时数据分析(简单介绍)

在当今这个信息化、数字化飞速发展的时代&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;和实时数据分析成为了技术革新的两大支柱。对于刚入行的新手来说&#xff0c;理解这两个概念及其相互作用不仅是迈入这一领域的第一步&#xff0c;更是掌握未来技术趋…

Acwing---842.排列数字

排列数字 1.题目2.基本思想3.代码实现 1.题目 给定一个整数 n&#xff0c;将数字 1∼n排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n。 输出格式 按字典序输出所有排列方案…