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

如何在JSONata中仅当code为code-333时删除subGroupB中step=2的对象

解决方法

针对你的需求,我们可以通过遍历并条件过滤的方式实现,以下分两种常用场景给出方案:

1. JavaScript 代码处理

直接遍历mainGroup数组,对每个元素判断subGroupA.code是否为code-333,符合条件时过滤subGroupB数组移除指定项,其余元素保持不变:

const originalData = {
  "mainGroup": [
    {
      "subGroupA": { "id": "id-111", "code": "code-111" },
      "subGroupB": [
        { "step": "1", "code": "code-111" },
        { "step": "2", "code": "code-111" }
      ]
    },
    {
      "subGroupA": { "id": "id-222", "code": "code-222" },
      "subGroupB": [
        { "step": "1", "code": "code-222" },
        { "step": "2", "code": "code-222" }
      ]
    },
    {
      "subGroupA": { "id": "id-333", "code": "code-333" },
      "subGroupB": [
        { "step": "1", "code": "code-333" },
        { "step": "2", "code": "code-333" }
      ]
    }
  ]
};

// 处理数据
const processedData = {
  ...originalData,
  mainGroup: originalData.mainGroup.map(item => {
    if (item.subGroupA.code === 'code-333') {
      return {
        ...item,
        subGroupB: item.subGroupB.filter(subItem => subItem.step !== '2')
      };
    }
    return item;
  })
};

console.log(JSON.stringify(processedData, null, 2));

2. MongoDB 聚合管道处理

如果你是用MongoDB的聚合操作,之前用$filter+$append导致元素数量增加,是因为错误拆分了数组再拼接。正确做法是用$map遍历每个mainGroup元素,配合$cond和$filter按需修改subGroupB:

db.yourCollection.aggregate([
  {
    $set: {
      mainGroup: {
        $map: {
          input: "$mainGroup",
          as: "groupItem",
          in: {
            $mergeObjects: [
              "$$groupItem",
              {
                subGroupB: {
                  $cond: [
                    // 判断当前组的code是否为code-333
                    { $eq: ["$$groupItem.subGroupA.code", "code-333"] },
                    // 符合条件则过滤subGroupB,移除step=2的项
                    {
                      $filter: {
                        input: "$$groupItem.subGroupB",
                        as: "subItem",
                        cond: { $ne: ["$$subItem.step", "2"] }
                      }
                    },
                    // 不符合条件则保留原subGroupB
                    "$$groupItem.subGroupB"
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
])

错误原因分析

你之前的操作把最后一个对象单独处理后用$append拼接,相当于在原数组的三个元素之外,又新增了一个处理后的对象,导致最终得到4个元素。而用$map是对原数组的每个元素逐一处理并返回,不会改变数组的长度,刚好保持3个对象的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:54:54