MongoDB 带总和的嵌套查找

MongoDB nested lookup with sum

我需要从数据库中检索整个单个对象层次结构作为 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}

如果您要进行“嵌套”查找,您可能想得过于复杂了。 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供大家参考。