如何在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
相关产品推荐
相关产品推荐

