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

MongoDB聚合如何保留匹配结果并生成计算字段?

MongoDB聚合:同时保存匹配结果与提取流派集合

你需要在MongoDB聚合流程中,同时保留match阶段的原始匹配结果,并生成一个去重的流派集合字段。以下是针对需求的调整方案:

问题背景

你希望从电影集合中筛选出含指定流派的电影,同时提取这些电影涉及的所有流派,最终输出结构如下:

{
  "result": [
    ... // 匹配到的完整电影文档
  ],
  "categories": ["Comedy", "Drama", "Romance", ...]
}

你的原始代码通过$unwind和$group只保留了流派,但丢失了原始电影数据,需要调整聚合逻辑。

解决方案

use('the_base');

db.movie.aggregate([
  // 1. 筛选含Drama流派的电影,取前5条
  { "$match": { "genres": "Drama" } },
  { "$limit": 5 },
  // 2. 收集所有匹配的电影文档,同时汇总所有电影的流派数组
  {
    "$group": {
      "_id": null,
      "result": { "$push": "$$ROOT" }, // 保存完整的原始电影文档
      "genreArrays": { "$addToSet": "$genres" } // 收集每个电影的流派数组
    }
  },
  // 3. 将二维流派数组扁平化为去重的一维数组
  {
    "$project": {
      "_id": 0,
      "result": 1,
      "categories": {
        "$reduce": {
          "input": "$genreArrays",
          "initialValue": [],
          "in": { "$setUnion": ["$$value", "$$this"] }
        }
      }
    }
  }
]);

步骤说明

  1. $match + $limit:和你原逻辑一致,筛选出含目标流派的电影并限制数量。
  2. $group:
    • $push: "$$ROOT":用$$ROOT指代当前完整文档,将所有匹配的电影存入result数组,完整保留原始数据。
    • $addToSet: "$genres":收集每个电影的流派数组,避免重复的流派组合(比如两部电影流派完全一致时只存一次)。
  3. $project:通过$reduce遍历二维流派数组,结合$setUnion将所有流派合并为一个去重的一维数组,命名为categories,同时移除默认的_id字段。

执行后即可得到包含匹配电影列表和去重流派集合的目标输出。

内容的提问来源于stack exchange,提问作者jhahspu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:45:30