$setIntersection (aggregation)

On this page本页内容

Definition定义

$setIntersection

Takes two or more arrays and returns an array that contains the elements that appear in every input array.接受两个或多个数组,并返回一个数组,该数组包含出现在每个输入数组中的元素。

$setIntersection has the following syntax:语法如下:

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

The arguments can be any valid expression as long as they each resolve to an array. 参数可以是任何有效的表达式,只要它们各自解析为一个数组。For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式

Behavior行为

$setIntersection performs set operation on arrays, treating arrays as sets. 对数组执行集合操作,将数组视为集合。If an array contains duplicate entries, $setIntersection ignores the duplicate entries. 如果数组包含重复条目,$setIntersection将忽略重复条目。$setIntersection ignores the order of the elements.忽略元素的顺序。

$setIntersection filters out duplicates in its result to output an array that contain only unique entries. 筛选出结果中的重复项,以输出仅包含唯一条目的数组。The order of the elements in the output array is unspecified.输出数组中元素的顺序未指定。

If no intersections are found (i.e. the input arrays contain no common elements), $setIntersection returns an empty array.如果没有找到交集(即输入数组不包含公共元素),$setIntersection将返回一个空数组。

If a set contains a nested array element, $setIntersection does not descend into the nested array but evaluates the array at top-level.如果集合包含嵌套数组元素,$setIntersection不会下降到嵌套数组中,而是在顶层计算数组。

ExampleResult
{ $setIntersection: [ [ "a", "b", "a" ], [ "b", "a" ] ] }
[ "b", "a" ]
{ $setIntersection: [ [ "a", "b" ], [ [ "a", "b" ] ] ] }
[ ]

Example示例

Consider an experiments collection with the following documents:考虑一个包含以下文档的experiments集合:

{ "_id" : 1, "A" : [ "red", "blue" ], "B" : [ "red", "blue" ] }
{ "_id" : 2, "A" : [ "red", "blue" ], "B" : [ "blue", "red", "blue" ] }
{ "_id" : 3, "A" : [ "red", "blue" ], "B" : [ "red", "blue", "green" ] }
{ "_id" : 4, "A" : [ "red", "blue" ], "B" : [ "green", "red" ] }
{ "_id" : 5, "A" : [ "red", "blue" ], "B" : [ ] }
{ "_id" : 6, "A" : [ "red", "blue" ], "B" : [ [ "red" ], [ "blue" ] ] }
{ "_id" : 7, "A" : [ "red", "blue" ], "B" : [ [ "red", "blue" ] ] }
{ "_id" : 8, "A" : [ ], "B" : [ ] }
{ "_id" : 9, "A" : [ ], "B" : [ "red" ] }

The following operation uses the $setIntersection operator to return an array of elements common to both the A array and the B array:以下操作使用$setIntersection运算符返回A数组和B数组共有的元素数组:

db.experiments.aggregate(
   [
     { $project: { A: 1, B: 1, commonToBoth: { $setIntersection: [ "$A", "$B" ] }, _id: 0 } }
   ]
)

The operation returns the following results:该操作返回以下结果:

{ "A" : [ "red", "blue" ], "B" : [ "red", "blue" ], "commonToBoth" : [ "blue", "red" ] }
{ "A" : [ "red", "blue" ], "B" : [ "blue", "red", "blue" ], "commonToBoth" : [ "blue", "red" ] }
{ "A" : [ "red", "blue" ], "B" : [ "red", "blue", "green" ], "commonToBoth" : [ "blue", "red" ] }
{ "A" : [ "red", "blue" ], "B" : [ "green", "red" ], "commonToBoth" : [ "red" ] }
{ "A" : [ "red", "blue" ], "B" : [ ], "commonToBoth" : [ ] }
{ "A" : [ "red", "blue" ], "B" : [ [ "red" ], [ "blue" ] ], "commonToBoth" : [ ] }
{ "A" : [ "red", "blue" ], "B" : [ [ "red", "blue" ] ], "commonToBoth" : [ ] }
{ "A" : [ ], "B" : [ ], "commonToBoth" : [ ] }
{ "A" : [ ], "B" : [ "red" ], "commonToBoth" : [ ] }
←  $setField (aggregation)$setIsSubset (aggregation) →