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

MongoDB聚合多值比对及结果数组展示问题求助

解决MongoDB聚合查询报错及实现需求的方案

你遇到的报错"The field name '$addFields' cannot be an operator name",核心原因是把$addFields操作符嵌套在了$group阶段的字段定义里——$addFields是MongoDB聚合管道中独立的阶段,不能作为$group的内部字段使用,这违反了聚合语法规则。

接下来针对你的需求(当订单下任意产品匹配指定状态时,输出该订单的年份、订单号及所有状态数组),我整理了简洁且符合要求的聚合实现方案:

核心思路

  1. 按订单号聚合:先将同一个order_number下的所有文档合并,收集该订单的全部order_status,同时保留schedule_datetime用于提取年份。
  2. 过滤目标订单:判断该订单的状态数组中是否包含查询的目标状态,仅保留符合条件的订单。
  3. 格式化输出结构:从schedule_datetime中提取年份,整理成你需要的输出格式。

具体实现代码

基础版本(保留所有状态,含重复)

假设查询目标状态为SUCCESS,执行以下聚合语句:

db.order_summary.aggregate([
  // 第一步:按订单号分组,收集所有状态和日期
  {
    $group: {
      _id: "$order_number",
      order_statuses: { $push: "$order_status" },
      schedule_datetime: { $first: "$schedule_datetime" }
    }
  },
  // 第二步:过滤出包含目标状态的订单
  {
    $match: {
      order_statuses: { $in: ["SUCCESS"] } // 替换为你要查询的状态
    }
  },
  // 第三步:提取年份,整理输出结构
  {
    $project: {
      _id: 0,
      order_number: "$_id",
      year: { $substr: ["$schedule_datetime", 0, 4] },
      order_statuses: 1
    }
  },
  // 可选:按年份倒序排序
  { $sort: { year: -1 } }
])

去重版本(匹配示例输出的无重复状态数组)

如果需要对订单的状态数组去重(和你给出的示例完全一致),只需将$group阶段的$push替换为$addToSet:

// 仅修改$group阶段的order_statuses字段
{
  $group: {
    _id: "$order_number",
    order_statuses: { $addToSet: "$order_status" }, // 用$addToSet实现去重
    schedule_datetime: { $first: "$schedule_datetime" }
  }
}

测试验证

  • 输入1:查询order_status=SUCCESS
    执行去重版本代码后,输出与你的预期完全一致:

    { "order_number" : "001", "order_statuses" : [ "SUCCESS" ], "year" : "2018" },
    { "order_number" : "111", "order_statuses" : [ "SUCCESS" ], "year" : "2017" }
    
  • 输入2:查询order_status=PARTLY_SUCCESS
    将$match阶段的$in值改为["PARTLY_SUCCESS"],执行后输出:

    { "order_number" : "222", "order_statuses" : [ "INPROGRESS", "ON_HOLD", "PARTLY_SUCCESS" ], "year" : "2017" }
    

原查询的其他问题修正

你的原查询还有几个额外问题:

  • 误用了不存在的study_date字段,应该替换为集合中实际存在的schedule_datetime;
  • 多层$group逻辑过于冗余,一次分组即可完成状态收集;
  • 错误地将$addFields嵌套在$group内部,需将其作为独立阶段使用(本次方案中已简化掉该阶段的需求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:34:11