MongoDB多集合字段匹配:修正聚合查询以统计用户记录创建数
修正MongoDB聚合查询的建议
原查询存在几个关键问题:
$group阶段将_id设为null,会把所有用户的记录合并为一组,无法按单个用户统计数量$sum引用了不存在的字段$matchedRecords.fieldToCount,没有正确指定统计逻辑- 不必要的
$unwind操作会额外增加计算开销
方案一:基于原查询调整优化
保留关联collection1的逻辑,修正分组和统计规则:
db.collection1.aggregate([ { $lookup: { from: "collection2", localField: "_id", foreignField: "Info.initiatedBy", as: "matchedRecords" } }, { $group: { _id: "$_id", // 按用户ID单独分组 count: { $sum: { $size: "$matchedRecords" } } // 直接统计匹配数组的长度 } }, { $project: { _id: 0, userId: "$_id", count: 1 } // 可选:调整输出为更直观的结构 } ])
方案二:反向查询(性能更优,推荐)
直接从collection2分组统计,不需要关联collection1(如果不需要过滤仅存在于collection1的用户,这种方式效率更高):
db.collection2.aggregate([ { $group: { _id: "$Info.initiatedBy", // 按创建者ID分组 count: { $sum: 1 } // 统计每组的记录数量 } }, { $project: { _id: 0, userId: "$_id", count: 1 } } ])
如果需要仅统计collection1中存在的用户,可以在方案二中加入过滤逻辑:
db.collection2.aggregate([ { $group: { _id: "$Info.initiatedBy", count: { $sum: 1 } } }, { $lookup: { from: "collection1", localField: "_id", foreignField: "_id", as: "userExists" } }, { $match: { "userExists": { $ne: [] } // 仅保留在collection1中存在的用户 } }, { $project: { _id: 0, userId: "$_id", count: 1 } } ])
最终输出示例:
[ { "userId": "user1", "count": 2 }, { "userId": "user2", "count": 1 } ]
内容的提问来源于stack exchange,提问作者RagaSGNur
相关产品推荐
相关产品推荐

