mongodb - 如何将 MongoDB 聚合用于通用集合操作(​​联合、交集、差异)

我遇到了一些特殊目的的集合操作实现,但一般情况下没有。执行集合操作的一般情况是什么(特别是交集、联合、对称差)。在 $where 或 map reduce 中使用 javascript 更容易弄清楚,但我想知道如何在聚合中执行此操作以获得 native 性能。

用一个例子来说明这个问题的更好方法。假设我有 2 个数组/集的记录:

db.colors.insert({
    _id: 1,
    left : ['red', 'green'],
    right : ['green', 'blue']
});

我想找到'left'和'right'数组的并集、交集和差异。更好的是,我想找到图片:

联合 --> ['red', 'green', 'blue']

交叉口 --> ['green']

对称差分 --> ['red', 'blue']

最佳答案

仅限 2.6+ 版:

从 MongoDB 2.6 版开始,这变得容易得多。您现在可以执行以下操作来解决此问题:

联合

db.colors.aggregate([
    {'$project': {  
                    union:{$setUnion:["$left","$right"]}
                 }
    }
]);

交叉口

db.colors.aggregate([
    {'$project': {  
                  int:{$setIntersection:["$left","$right"]}
                 }
    }
]);

相对补语

db.colors.aggregate([
    {'$project': {  
                    diff:{$setDifference:["$left","$right"]}
                 }
    }
]);

对称差分

db.colors.aggregate([
    {'$project': {  
                    diff:{$setUnion:[{$setDifference:["$left","$right"]}, {$setDifference:["$right","$left"]}]}
                 }
    }
]);

注意:有一个 ticket要求将对称差异添加为核心功能,而不必合并两组差异。

https://stackoverflow.com/questions/17268770/

相关文章:

mongodb - 为什么 MongoDB 可以创建唯一索引而 Mongoid 不能?

java - Spring数据mongodb审计不起作用..(Java配置)

mongodb - 复合索引可以服务多个查询吗

php - 查询 1000 万个 mongodb 文档

ruby-on-rails - 通过 AWS opsworks 设置 mongodb

python - Pymongo 或 Mongodb 将两个相等的 python 字典视为不同的对象

mongodb - 为什么 Spring Data MongoDB 无法实例化这种嵌套类型结构?

php - 如何在 Waterline 或 MongoDB 中选择、分组和加入

javascript - 如何处理 MongoDB 键名中的点?

node.js - 在 docker 容器中安装 Mongoose