Mongoose与MongoDB实现按国家分组查询关联用户的方法咨询
你当前写的聚合里用的$in是条件查询运算符,不能在$group阶段作为累加器使用,自然得不到想要的结果。正确的聚合管道写法如下:
Post.aggregate([ // 1. 按国家分组,收集对应国家的所有用户名 { $group: { _id: "$country", users: { $addToSet: "$user" } } }, // 2. 合并所有分组结果,组装为键值对数组 { $group: { _id: null, countryList: { $push: { k: "$_id", v: "$users" } } } }, // 3. 转换为目标格式的对象作为输出根节点 { $replaceRoot: { newRoot: { $arrayToObject: "$countryList" } } } ])
说明
- 第一步
$group阶段:以country字段为分组依据,$addToSet会把同一个国家下的用户名收集为无重复的数组,如果允许重复用户名可以把$addToSet替换为$push。 - 第二步
$group阶段:把上一步的所有国家分组合并为一个大组,将国家作为键、对应用户列表作为值组装成键值对数组。 - 第三步
$replaceRoot阶段:通过$arrayToObject把键值对数组转换为你需要的「国家为键、用户列表为值」的对象,直接作为最终输出的根结构。
运行后得到的输出格式为:
[ { Mexico: [ 'Kim', 'Darren', 'Joe' ], USA: [ 'Bob' ] } ]
如果你需要将用户列表从数组转为Set集合,拿到查询结果后自行遍历转换即可。
内容的提问来源于stack exchange,提问作者HelpANoobOut
相关产品推荐
相关产品推荐

