MongoDB setIntesection关于数组的数组

MongoDB setIntesection关于数组的数组,mongodb,Mongodb,我是Mongo DB的新手,在让聚合交集工作时遇到了一些麻烦 假设我的集合中只有以下文档: {"ids" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] } 我想回来 {"intersection" : [1, 7]} 我正在做: db.collection.aggregate([ {$project: {intersection:{$setIntersection:"$ids"}}} ]) 但这

我是Mongo DB的新手,在让聚合交集工作时遇到了一些麻烦

假设我的集合中只有以下文档:

{"ids" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] }
我想回来

{"intersection" : [1, 7]}
我正在做:

db.collection.aggregate([ {$project: {intersection:{$setIntersection:"$ids"}}} ])
但这正在回归

{"intersection" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] }
我假设这是因为“$ids”被解释为int数组的数组,而var args中的每个arg都是int数组


您知道如何使其工作吗?

看起来您想要查找ID中每个数组中出现的所有元素

这不能用set intersection来处理,因为这些是数组元素,而不是文档中的字段,并且在投影中没有引用单个数组元素的方法

以下是您的解决方案,可能有效,也可能无效,具体取决于其他聚合需求:

db.inter.aggregate(
     {$project:{ids:1,  sz:{$size:"$ids"}}},
     {$unwind:"$ids"},
     {$unwind:"$ids"},
     {$group:{_id:{_id:"$_id",ids:"$ids"},count:{$sum:1},need:{$first:"$sz"}}},
     {$project:{keep:{$eq:["$need","$count"]}}},{$match:{keep:true}},{$sort:{_id:1}},
     {$group:{_id:"$_id._id",intersection:{$push:"$_id.ids"}}},
     {$project:{ intersection:1}}
)

这将计算出数组的数组有多少个元素,然后计算每个数字在展开集中出现的次数。如果它与大小相同,则它必须位于每个子元素中。但是,这假设每个子元素不能有相同的数字两次。

您想返回[1,7]-这代表什么?每个子阵列中出现的元素?是的,所有子阵列的交点。