Mongodb 如何将多个文档中的两个字段数组合并到一个集合中?

Mongodb 如何将多个文档中的两个字段数组合并到一个集合中?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我的MongoDB收集数据如下所示: {u id:“1”,“array1:[“1”,“2”]}, {“_id”:“2”,“array2”:[“1”,“3”]}, {“_id”:“3”,“array1”:[]}, {“_id”:“4”,“array2”:[]}, {u id:“5”}, {“_id”:“6”,“array1”:[“3”,“4”],“array2”:[“5”]} 我想找到一个查询,它只返回单个数组中的唯一数组值,如下所示: {u id:“theID”,“result:[“1”,“2

我的MongoDB收集数据如下所示:

{u id:“1”,“array1:[“1”,“2”]},
{“_id”:“2”,“array2”:[“1”,“3”]},
{“_id”:“3”,“array1”:[]},
{“_id”:“4”,“array2”:[]},
{u id:“5”},
{“_id”:“6”,“array1”:[“3”,“4”],“array2”:[“5”]}
我想找到一个查询,它只返回单个数组中的唯一数组值,如下所示:

{u id:“theID”,“result:[“1”,“2”,“3”,“4”,“5”]}

身份证并不重要。请注意,
array1
array2
,两者都可以存在于文档中,也可以两者都不存在,甚至可以为空。我尝试了许多聚合和级联查询命令,但无法得到所需的响应。

为此,您需要使用提供对聚合管道访问的
.aggregate()
方法

管道中的第一阶段使用运算符筛选出那些使用运算符和的
array1
array2
都不显示的文档。此操作员减少了要在管道中处理的文档数量

下一个阶段是基本上使用返回一个数组,其中包含出现在任何数组中的元素;它还过滤掉结果中的重复元素。也不是使用运算符返回第一个表达式或空数组的值,这取决于第一个表达式的计算结果是否为null(这里的表达式是“array1”和“array2”)。 从这里开始,您需要使用操作符对“arrays”字段进行反规范化

在管道的最后一个阶段,您需要使用累加器操作符,它返回一个唯一值的数组

db.getCollection('collection').aggregate([
{“$match”:{
“$or”:[
{“array1.0”:{“$exists”:true},
{“array2.0”:{“$exists”:true}
]
}}, 
{“$project”:{
“数组”:{
“$setUnion”:[
{“$ifNull”:[“$array1”,[]]},
{“$ifNull”:[“$array2”,[]]
] 
}
}}, 
{“$unwind”:“$arrays”},
{“$group”:{
“_id”:空,
“数组”:{“$addToSet”:“$arrays”}
}} 
] )
这将产生:

{u id:null,“数组”:[“5”、“3”、“1”、“4”、“2”]}

这并不像我想象的那么容易。我的想法是首先使用
$setUnion
将两个数组压缩成一个数组,然后使用
$addToSet
将结果数组展开,然后使用
$group
将它们压缩成一个数组,但不幸的是,
$setUnion
不起作用,除非文档中同时存在这两个字段。使用
$ifNull
$setUnion
很重要,否则如果一个数组为空,则会得到NULL