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

MongoDB聚合查询:按需选择根字段与优先级i18n本地化字段

如何在MongoDB中按优先级获取本地化字段并扁平化结果?

完整聚合查询实现

针对你的需求,我们可以通过MongoDB的聚合管道结合$ifNull、$objectToArray、$arrayToObject等操作符实现,以下是完整的查询代码:

db.collection.aggregate([
  // 第一步:筛选根字段,同时按优先级获取目标本地化内容
  {
    $project: {
      _id: 1,
      price: 1,
      selectedLocalized: {
        $ifNull: [
          "$localized.de", // 优先取德语字段
          {
            $ifNull: [
              "$localized.en", // 德语不存在则取英语
              // 两者都不存在时,取第一个可用的本地化字段内容
              { $arrayElemAt: [{ $objectToArray: "$localized" }, 0] }.v
            ]
          }
        ]
      }
    }
  },
  // 第二步:重构结果结构(可选扁平化)
  {
    $project: {
      _id: 1,
      price: 1,
      // 保留localized结构,仅包含选中的语言项(匹配你给出的示例)
      localized: {
        $arrayToObject: [
          [
            {
              k: {
                $ifNull: [
                  { $cond: [{ $exists: ["$localized.de", true] }, "de", ""] },
                  { $cond: [{ $exists: ["$localized.en", true] }, "en", ""] },
                  { $arrayElemAt: [{ $objectToArray: "$localized" }, 0] }.k
                ]
              },
              v: "$selectedLocalized"
            }
          ]
        ]
      }
      // 如果需要完全扁平化(将name/description直接放到根层级),替换上面的localized为:
      // name: "$selectedLocalized.name",
      // description: "$selectedLocalized.description"
    }
  }
])

代码逻辑拆解

  1. 第一阶段$project

    • 直接保留_id和price两个指定根字段
    • 用$ifNull实现优先级判断:依次检查de、en字段是否存在,存在则直接取值;若两者都不存在,通过$objectToArray将localized对象转为键值对数组,再用$arrayElemAt取第一个元素的内容
  2. 第二阶段$project

    • 重构结果结构:
      • 如果要匹配你给出的示例(保留localized键且仅含选中语言项),用$arrayToObject将选中的语言编码和内容重新组装成对象
      • 如果需要扁平化(消除嵌套),直接将selectedLocalized中的name、description映射到根字段即可

版本兼容性说明

  • 上述代码兼容MongoDB 3.4及以上版本
  • 若使用MongoDB 5.0+,可以用$first简化取第一个可用字段的逻辑:$first: { $objectToArray: "$localized" }.v

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:25:27