[英]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.