mongodb中的数组交集与聚合框架

Ran*_*eep 1 mongoose mongodb node.js aggregation-framework

我有一个模式集合(猫鼬)说:

{
  name : String,
  age  : Number,
  params : [Number]  // e.g. : params = [1,21,45,32,0] , usually they are very small arrays
}
Run Code Online (Sandbox Code Playgroud)

该集合有1000多种此类文件

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

我想使用聚合并找到其参数包含baseParams数组中大多数数字的文档的id,如max(对于每个doc交集(baseParams,params))

我终于需要按年龄排序的前5个文件的_id:1

任何人的想法?

inn*_*SPG 5

怎么样(在mongo shell中)?简单地翻译成猫鼬

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}}
 ])
Run Code Online (Sandbox Code Playgroud)

第一阶段$ unwind打破数组字段,这样你就可以为每个_id提供一些文件,这些文件等于params中的elt数,每个文件都有一个数组params的值.$ match选择与我们想要的文档相对应的文档.$ group使用_id和age作为关键字对它们进行分组,并计算每个组中的doc数量; 这完全对应于交叉点中的元素数量.$ limit进入前五名.$ project和$ sort按年龄排序完成剩余的工作