MongoDB如何用aggregate的$group和$sum统计集合各字段相同值数量
问题1:全集合user_id、group_id、description字段取值出现次数统计
你可以使用$facet算子并行执行三个统计子管道,一次性得到三个字段的统计结果,参考聚合语句如下:
db.users.aggregate([ { $facet: { // 统计user_id各值出现次数 user_id_stats: [ { $group: { _id: "$user_id", count: { $sum: 1 } } }, { $project: { k: { $toString: "$_id" }, v: { count: "$count" }, _id: 0 } } ], // 统计group_id各值出现次数 group_id_stats: [ { $group: { _id: "$group_id", count: { $sum: 1 } } }, { $project: { k: { $toString: "$_id" }, v: { count: "$count" }, _id: 0 } } ], // 统计description各值出现次数 description_stats: [ { $group: { _id: "$description", count: { $sum: 1 } } }, { $project: { k: { $cond: [{ $eq: ["$_id", null] }, "null", { $toString: "$_id" }] }, v: { count: "$count" }, _id: 0 } } ] } }, { $project: { user_id: { $arrayToObject: "$user_id_stats" }, group_id: { $arrayToObject: "$group_id_stats" }, description: { $arrayToObject: "$description_stats" } } } ])
问题2:按user_id分组统计对应group_id、description取值出现次数
先按user_id分组收集该用户的所有字段值,再通过$map+$filter统计各取值的出现次数,参考聚合语句如下:
db.users.aggregate([ { $group: { _id: "$user_id", all_group_ids: { $push: "$group_id" }, all_descriptions: { $push: "$description" } } }, { $set: { // 统计当前用户group_id各值出现次数 group_id: { $arrayToObject: { $map: { input: { $setUnion: "$all_group_ids" }, as: "gid", in: { k: { $toString: "$$gid" }, v: { count: { $size: { $filter: { input: "$all_group_ids", cond: { $eq: ["$$this", "$$gid"] } } } } } } } } }, // 统计当前用户description各值出现次数 description: { $arrayToObject: { $map: { input: { $setUnion: "$all_descriptions" }, as: "desc", in: { k: { $cond: [{ $eq: ["$$desc", null] }, "null", { $toString: "$$desc" }] }, v: { count: { $size: { $filter: { input: "$all_descriptions", cond: { $eq: ["$$this", "$$desc"] } } } } } } } } } } }, { $project: { _id: 0, user_id: "$_id", group_id: 1, description: 1 } }, { $sort: { user_id: 1 } } ])
内容的提问来源于stack exchange,提问作者Anton S.
相关产品推荐
相关产品推荐

