译自:http://docs.mongoing.com/manual-zh/reference/operator/aggregation/redact.html

http://www.myexception.cn/go/2046467.html

$redact

根据字段所处的document结构的级别,对文档进行“修剪”,它通常和“判断语句if-else”结合使用即“$cond”。$redact可选值有3个:

1)$$DESCEND:包含当前document级别的所有fields。当前级别字段的内嵌文档将会被继续检测。

2)$$PRUNE:不包含当前文档或者内嵌文档级别的所有字段,不会继续检测此级别的其他字段,即使这些字段的内嵌文档持有相同的访问级别。

3)$$KEEP:包含当前文档或内嵌文档级别的所有字段,不再继续检测此级别的其他字段,即使这些字段的内嵌文档中持有不同的访问级别。

{_id: 1,tags: [ "G", "STLW" ],year: 2014,subsections: [{subtitle: "Section 1",tags: [ "SI", "G" ],},{subtitle: "Section 2",tags: [ "STLW" ],},{subtitle: "Section 3",tags: [ "TK" ],content: {tags: [ "HCS" ]}}]
}

那么对于语句:

 $redact: {$cond: {if: { $gt: [ { $size: { $setIntersection: [ "$tags", ["STLW","G"] ] } }, 0 ] },then: "$$DESCEND",else: "$$PRUNE"}}

$setIntersection表示将2个数组的交集中不同元素的个数,$cond就是一个三元表达式,此例中表示“如果交集元素的个数大于0,则值为为$$DESCEND,否则为$$PRUNE”。对于此文档(ROOT级别)的最高级别的tags值为["G","STLW"],此级别值为$$DESCEND,即此tage同级别的其他字段将会包含;那么继续检测“subsections.tags”级别的所有文档(是个数组,则逐个检测),基本思路类似,如果此级别返回$$DECEND那么继续检测“subsections.tags.content.tags”是否符合访问规则,如果返回$$PRUNE,那么此tags所在的内嵌文档的所有字段将被排除,即使与此tags同级别的contents.tags符合访问规则。最终输出结果:

{"_id" : 1,"tags" : [ "G", "STLW" ],"year" : 2014,"subsections" : [{"subtitle" : "Section 1","tags" : [ "SI", "G" ],"content" : "Section 1"},{"subtitle" : "Section 2: Analysis","tags" : [ "STLW" ],"content" : "Section 2"}]
}

再如如下例子:

db.accounts.find({})的查询结果如下:


    "_id" : 1.0, 
    "level" : 1.0, 
    "acct_id" : "xyz123", 
    "cc" : {
        "level" : 5.0, 
        "type" : "yy", 
        "num" : 0.0, 
        "exp_date" : ISODate("2015-11-01T00:00:00.000+0000"), 
        "billing_addr" : {
            "level" : 5.0, 
            "addr1" : "123 ABC Street", 
            "city" : "Some City"
        }, 
        "shipping_addr" : [
            {
                "level" : 3.0, 
                "addr1" : "987 XYZ Ave", 
                "city" : "Some City"
            }, 
            {
                "level" : 3.0, 
                "addr1" : "PO Box 0123", 
                "city" : "Some City"
            }
        ]
    }, 
    "status" : "A"
}

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

的查询结果如下:


    "_id" : 1.0, 
    "level" : 1.0, 
    "acct_id" : "xyz123", 
    "status" : "A"
}

mongodb的聚合函数的$redact方法运用。相关推荐

  1. 聚合函数的python方法

    聚合函数的python方法 最大值max: num=[1,2,3,4] def L_max(numb):one=numb[0]for i in numb:if i > one:one = ire ...

  2. mysql 聚合函数嵌套_Mysql聚合函数嵌套如何使用 Mysql聚合函数嵌套使用方法

    Mysql聚合函数嵌套如何使用?本篇文章小编给大家分享一下Mysql聚合函数嵌套使用方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 目的:Mysql 聚合函数嵌套使用 ...

  3. MongoDB 之聚合函数查询统计

    第一关:第1关:聚合管道操作符将文档定制格式输出(一) (命令行) mongo use test1 db.educoder.insert([{ _id:1, course:'Python表达式问题求解 ...

  4. MongoDB的聚合函数 Aggregate

    Aggregate的使用,有利于我们对MongoDB中的集合进行进一步的拆分. 示例: db.collection.aggregate({$match:{x:1},{limit:10},{$group ...

  5. oracle 自定义 聚合函数

    Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object (  --聚合函数的实质就是一个对象       sum ...

  6. 聚合函数处理excel数据------(一)

    导入模块 import numpy as np import pandas as pd 一.transform 聚合函数 在pandas 或者numpy 中没有现成的函数可以使用,可以通过transf ...

  7. oracle高级函数去重,傅老师课堂:Oracle高级应用之去重聚合函数

    开篇一笑:高中的时候,自行车被偷,早上顺路搭同学的自行车.我坐在后座看到前面一大妈跑步,很猥琐的对同学说:"你看前面那个肥婆跑得屁股都甩圆了!"这货沉默了一下.当我们和大妈擦身而过 ...

  8. SQL Server 聚合函数

    在数据库中有大量的数据,如果统计起来会较为麻烦,比如统计某数据的平均值或者总数值,但是在SQL Server中有聚合函数可以使用,聚合函数会对一个组进行运算然后返回计算的结果,通常和GROUP BY子 ...

  9. mongodb 聚合函数求平均值及时差处理

    最近因为公司需要做一些小时平均和每日平均的统计,于是去找了下mongodb的系统函数.通过avg和聚合查询实现了结果,但是发现统计的时候mongodb函数$dateToString: { format ...

最新文章

  1. 模拟spring - 简单实现spring IOC
  2. Insert Interval
  3. boost::gil模块实现dynamic image的测试程序
  4. mybatis----#与$区别
  5. extends 抽象方法_关于abstract抽象类的理解
  6. 【视频】利用IDEA 创建 spring mvc项目
  7. ApiPost报TypeError: Cannot read property ‘oauth‘ of undefined的解决方案
  8. 架构师的职责都有哪些?
  9. Unity5.x 依赖关系打包 AssetBundle 研究
  10. 圣诞节的整理前两周的内容4
  11. axios 上传文件 封装_axios 封装【满足常规数据上传及file上传】
  12. 大事件!35的程序员竟然失去了面试资格,这是为什么?
  13. HDU ACM 2647 Reward (topology----拓扑排序)
  14. 关于Eclipse配置Tomcat8的问题
  15. 2D游戏案例:(平台下落类)Solo Fall
  16. vb.net 简单取摄像头图片_简单的BP网络识别液晶字符
  17. 信息化、数字化与数智化傻傻分不清
  18. 力扣第四十六题(全排列)详解
  19. 一文读懂IaaS、PaaS、SaaS的含义及区别
  20. 快速入门Spring之SpringIOC

热门文章

  1. 可以找到单词起源的查询网站
  2. Linux基础防火墙、KVM、zabbix具体配置
  3. 复旦大学科学计算机系王欢,复旦大学计算机科学技术学院举行2019级研究生新生入学教育大会...
  4. 1598 - 文具店的折扣
  5. PJzhang:kali linux安装金山wps、永中office、sougoupinyin、ibuspiyin
  6. 【NOIP 2017 提高组 DAY1 T1】小凯的疑惑
  7. netscape.javascript.JSException: Unknown source:Invalid argument.
  8. 飞针测试和专用治具测试流程详解
  9. django基础到高手知识笔记总结,50页笔记,共10大模块(第一期).md
  10. ORA-02287: 此处不允许序号