You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:22:43