在MongoDB中使用Aggregation框架交集数组

我有一个与模式(mongoose)集合说:

{ name : String, age : Number, params : [Number] // eg : params = [1,21,45,32,0] , usually they are very small arrays } 

这个集合有1000个这种types的文档

说,我有一个baseParams = [1,20,30,4,7];

我想要使​​用聚合,并findparams包含的baseParams数组中的最大数量的文档的id,如max(对于每个doc交集(baseParams,params))

我最后需要按年龄sorting的前五名文件的_id:1

任何想法的人?

那么这个(在mongo shell中)呢? 只需翻译成mongoose

 db.ss.aggregate([ {$unwind: '$params'}, {$match: {params: {$in: [1,20,30,4,7]} } }, {$group: {_id: {_id:"$_id", age: "$age"}, nb: {"$sum":1} } }, {$sort: {nb:-1}}, {$limit:5}, {$project: {_id:"$_id._id", age:"$_id.age", nb: "$nb"} }, {$sort:{age:1}} ]) 

第一阶段$ unwind分解数组字段,以便每个_id都有一些等于参数中elt个数的文档,每个文档都有一个单独的数组参数值。 $匹配select对应于我们想要的文件。 $ group将他们用_id和age作为关键字,并计算每个组中doc的数量; 这恰好对应于交叉点中的元素的数量。 $限额前五名。 $ project和$ sort按年龄sorting完成剩余的工作