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

如何通过Mongo聚合动态提取charges中指定索引的字符串值?

动态提取MongoDB文档中charges字段所有键的指定索引值

可以通过MongoDB聚合管道的$objectToArray、$map和$arrayToObject组合实现,无需硬编码charges的动态键名,具体实现如下:

聚合管道代码(提取连续索引,如1、2)

db.collection.aggregate([
  {
    $addFields: {
      charges: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$charges" },
            as: "charge",
            in: {
              k: "$$charge.k",
              v: {
                $join: [
                  {
                    $slice: [
                      { $split: ["$$charge.v", ","] },
                      1, // 起始索引
                      2  // 提取元素数量(对应索引1、2)
                    ]
                  },
                  ","
                ]
              }
            }
          }
        }
      }
    }
  }
])

关键步骤解释

  1. $objectToArray: "$charges":将charges的动态键值对象转换为[{k: "键名", v: "值字符串"}, ...]格式的数组,实现对所有动态键的遍历。
  2. $map遍历处理每个键值对:
    • 保留原键名:k: "$$charge.k"
    • 处理值字符串:
      • $split:把逗号分隔的字符串拆分为数组
      • $slice:从拆分后的数组中,从索引1开始提取2个元素(正好对应需求中的索引1、2)
      • $join:将提取到的元素重新拼接为逗号分隔的字符串
  3. $arrayToObject:将处理后的键值对数组转回对象结构,恢复charges的原始格式。

灵活提取任意索引(如非连续的1、3)

如果需要提取的索引不是连续的,可将$slice替换为$map结合$arrayElemAt实现:

db.collection.aggregate([
  {
    $addFields: {
      charges: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$charges" },
            as: "charge",
            in: {
              k: "$$charge.k",
              v: {
                $join: [
                  {
                    $map: {
                      input: [1, 3], // 自定义要提取的索引列表
                      as: "idx",
                      in: { $arrayElemAt: [{ $split: ["$$charge.v", ","] }, "$$idx"] }
                    }
                  },
                  ","
                ]
              }
            }
          }
        }
      }
    }
  }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:32:36