繁体   English   中英

带有聚合框架的mongodb中的数组交集

[英]Array intersection in mongodb with Aggregation framework

我有一个架构(猫鼬)说:

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

馆藏有数千种此类文件

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

我想使用聚合并在baseParams数组中查找其参数包含最多数量数字的文档ID,例如max(对于每个文档交叉点(baseParams,params))

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

有任何想法吗?

那么(在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具有等于param的elt数量的文档,每个文档都具有数组param的单个值。 $ match选择与我们想要的文件相对应的文件。 $ group使用_id和age作为关键字对它们进行分组,并计算每个组中的文档数; 这恰好对应于相交中的元素数量。 $ limit进入前五名。 $ project和$ sort完成了按年龄排序的其余工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM