MongoDB聚合运算符:$setDifference

MongoDB聚合运算符:$setDifference

文章目录

  • [MongoDB聚合运算符:setDifference](#MongoDB聚合运算符:setDifference)

$setDifference聚合运算符比较两个数组,返回之前第一个数组中存在的元素,相当于返回第二个数组对于第一个数组的补集。

语法

js 复制代码
{ $setDifference: [ <expression1>, <expression2> ] }

参数可以是任何能够解析为数组的表达式。

使用

  • $setDifference 对数组执行集合操作,将数组视为集合。如果数组包含重复元素,$setDifference 会忽略重复元素。 $setDifference 忽略元素的顺序。
  • $setDifference 会过滤掉结果中的重复元素,输出仅包含唯一元素的数组,输出数组中元素的顺序未指定。
  • 如果集合包含嵌套数组元素,则 $setDifference 不会下降到嵌套数组,而只处理顶层数组元素。
举例 结果
{ $setDifference: [ [ "a", "b", "a" ], [ "b", "a" ] ] } [ ]
{ $setDifference: [ [ "a", "b" ], [ [ "a", "b" ] ] ] } [ "a", "b" ]

举例

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

js 复制代码
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" ] }
] )

下面的聚合使用 $setDifference 运算符返回在flowerFieldB 数组中找到但在flowerFieldA 数组中未找到的元素的数组:

js 复制代码
db.flowers.aggregate(
   [
     { $project: { flowerFieldA: 1, flowerFieldB: 1, inBOnly: { $setDifference: [ "$flowerFieldB", "$flowerFieldA" ] }, _id: 0 } }
   ]
)

操作返回下面的结果:

json 复制代码
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ], "inBOnly" : [ "jasmine" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ], "inBOnly" : [ "jasmine" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ], "inBOnly" : [ [ "rose" ], [ "orchid" ] ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ], "inBOnly" : [ [ "rose", "orchid" ] ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ], "inBOnly" : [ "rose" ] }
相关推荐
360智汇云7 分钟前
HULK PostgreSQL 图数据库化方案:Apache AGE 的引入与实践
数据库·postgresql·apache
SelectDB技术团队16 分钟前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
数据库·数据仓库·人工智能·sql·apache
万邦科技Lafite1 小时前
阿里巴巴商品详情API返回值:电商精准营销的关键
大数据·数据库·人工智能·电商开放平台
tc&1 小时前
为什么 Kamailio 模块封装的 MySQL 函数能有效防范 SQL 注入?
数据库·sql·mysql·网络攻击模型·kamailio
cookqq1 小时前
Java+MySQL时区难题-Date自动转换String差8小时
数据库·mysql
sugarzhangnotes1 小时前
MySQL 8.0升级中的字符集陷阱与解决方案
android·数据库·mysql
BD_Marathon1 小时前
MyBatis核心配置文件之mappers
java·数据库·mybatis
float_六七1 小时前
数据库管理系统(DBMS) 的核心组成部分
数据库·oracle
科技块儿1 小时前
内网系统IP离线数据库搭建与维护完整方案
数据库·网络协议·tcp/ip
小徐不徐说2 小时前
避坑指南:Qt 中 Lambda 表达式崩溃原因与高效使用实践
数据库·c++·qt·面试