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

时间:2013-07-24 13:48:43

标签: node.js mongodb mongoose aggregation-framework

我有一个带有架构的集合(mongoose)说:

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

该集合有1000个这种类型的文件

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

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

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

任何想法?

1 个答案:

答案 0 :(得分: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}}
 ])

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