1

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

{
  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(对于每个文档交集(baseParams,params))

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

有什么想法吗?

4

1 回答 1

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 作为 key 将它们分组,并计算每个组中的 doc 数量;这完全对应于交叉点中的元素数量。$limit 占据前五名。$project 和 $sort 完成了按年龄排序的其余工作

于 2013-07-24T15:19:17.817 回答