【问题标题】:MongoDB nested lookup with sum使用 sum 的 MongoDB 嵌套查找
【发布时间】:2026-02-04 10:20:03
【问题描述】:

我需要从数据库中检索整个单个对象层次结构作为 JSON。同时从 3 级嵌套集合中求和。

场地

{"_id": "2", "name": "name2"}
{"_id": "3", "name": "name3"}
{"_id": "4", "name": "name4"}
{"_id": "5", "name": "name5"}

用户

{"_id": "u2", "name": "u2", venue_id: "2"}
{"_id": "u3", "name": "u3", venue_id: "2"}
{"_id": "u4", "name": "u4", venue_id: "3"}
{"_id": "u5", "name": "u5", venue_id: "4"}

显示

{"_id": "s2", "name": "s2", host_id: "u2", "duration": 20}
{"_id": "s3", "name": "s3", host_id: "u2", "duration": 50}
{"_id": "s4", "name": "s4", host_id: "u2", "duration": 60}
{"_id": "s5", "name": "s5", host_id: "u4", "duration": 30}

我需要检索用户与该场地相关联的所有场地以及显示持续时间的总和。

输出

{"_id": "2", "name": "name2", "duration": 130}
{"_id": "3", "name": "name3", "duration": 30}
{"_id": "4", "name": "name4", "duration": 0}
{"_id": "5", "name": "name5", "duration": 0}

【问题讨论】:

  • 请出示您迄今为止工作的数据证明,* 不是为您提供所有答案的地方,而是在您自己尝试后遇到困难时提供帮助。供您研究:docs.mongodb.com/manual/reference/operator/aggregation/lookup
  • 我目前正在做的是嵌套查找,然后我最终得到每个用户的总和。当然,没有得到预期的输出。我现在会更新,谢谢。

标签: mongodb mongodb-query aggregation-framework lookup


【解决方案1】:

如果您要使用“嵌套”查找,您可能会想得过于复杂。 2 个简单的$lookup 应该足以满足您的需要。执行最后的$group 以获得预期结果。

db.venue.aggregate([
  {
    "$lookup": {
      "from": "user",
      "localField": "_id",
      "foreignField": "venue_id",
      "as": "userLookup"
    }
  },
  {
    "$unwind": {
      path: "$userLookup",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    "$lookup": {
      "from": "show",
      "localField": "userLookup._id",
      "foreignField": "host_id",
      "as": "showLookup"
    }
  },
  {
    "$unwind": {
      path: "$showLookup",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $group: {
      _id: "$_id",
      name: {
        $first: "$name"
      },
      duration: {
        $sum: "$showLookup.duration"
      }
    }
  }
])

这是Mongo playground 供您参考。

【讨论】:

  • 哇,我真的想多了,非常感谢雷!