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

MongoDB未知字段名时引用字段及本地化子文档查询方案

MongoDB动态本地化字段的唯一字符串查询方案

针对你不知道本地化字段(myLocalizedField)的语言键、且需筛选出至少包含指定子串的文档,并提取所有语言的唯一字符串需求,可通过以下聚合管道实现:

完整聚合管道

[
  // 匹配至少一个语言字段包含目标子串的文档
  {
    $match: {
      $expr: {
        $anyElementTrue: {
          $map: {
            input: { $objectToArray: "$myLocalizedField" },
            as: "langItem",
            in: { $regexMatch: { input: "$$langItem.v", regex: "你的目标子串", options: "i" } }
          }
        }
      }
    }
  },
  // 将本地化对象转为键值对数组(键=语言代码,值=字符串)
  {
    $addFields: {
      langEntries: { $objectToArray: "$myLocalizedField" }
    }
  },
  // 展开数组,每个语言键值对成为独立文档
  { $unwind: "$langEntries" },
  // 按字符串内容分组,去重并可选记录对应语言
  {
    $group: {
      _id: "$langEntries.v", // 以字符串内容作为分组依据实现去重
      languages: { $addToSet: "$langEntries.k" } // 可选:收集该字符串对应的所有语言代码
    }
  },
  // 可选:重命名字段让结果更直观
  {
    $project: {
      _id: 0,
      string: "$_id",
      languages: 1
    }
  }
]

关键阶段说明

  1. $match阶段

    • 用$objectToArray将动态键的本地化对象转为[{k: 语言代码, v: 字符串}]格式的数组
    • 通过$map遍历数组元素,用$regexMatch检查每个字符串是否包含目标子串
    • $anyElementTrue确保只要有一个语言字段符合条件,该文档就会被匹配
  2. $group阶段

    • 以$langEntries.v(字符串内容)作为_id分组,自动实现字符串去重
    • 可选的$addToSet: "$langEntries.k"会收集该字符串出现过的所有语言代码,方便查看多语言对应关系

如果只需要提取唯一字符串列表,可将最后两个阶段替换为:

{
  $group: {
    _id: null,
    uniqueStrings: { $addToSet: "$langEntries.v" }
  }
},
{
  $project: {
    _id: 0,
    uniqueStrings: 1
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:17:33