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

Mongoose按条件获取多语言name字段相关问题咨询

问题解答

Q1:查询仅返回对应法语文本

要实现该需求可以使用Mongoose的聚合管道处理,先匹配查询条件,再对name数组做字段转换,示例代码如下:

db.langs.aggregate([
  // 第一步:匹配查询条件,和原find条件一致
  {
    $match: {
      "name.language": "fr-CA",
      parentId: 1
    }
  },
  // 第二步:转换name字段为对应的法语文本
  {
    $set: {
      name: {
        // 取出name数组中语言为fr-CA的第一个元素的text值
        $getField: {
          field: "text",
          input: {
            $arrayElemAt: [
              {
                $filter: {
                  input: "$name",
                  cond: { $eq: ["$$this.language", "fr-CA"] }
                }
              },
              0
            ]
          }
        }
      }
    }
  }
])

该写法会保留文档所有原有字段,仅将name字段从数组替换为匹配到的法语文本。

Q2:优先返回法语、法语不存在则返回英语

Mongoose支持该需求,依然通过聚合管道实现,核心是对多语言做优先级判断,示例代码如下:

db.langs.aggregate([
  // 第一步:匹配parentId条件,不需要限制必须有法语
  {
    $match: {
      parentId: 1
    }
  },
  // 第二步:按优先级取对应语言的文本
  {
    $set: {
      name: {
        // 先判断是否存在法语,存在则返回法语文本,否则返回英语文本
        $ifNull: [
          // 尝试取法语文本
          {
            $getField: {
              field: "text",
              input: {
                $arrayElemAt: [
                  { $filter: { input: "$name", cond: { $eq: ["$$this.language", "fr-CA"] } } },
                  0
                ]
              }
            }
          },
          // 法语不存在时取英语文本
          {
            $getField: {
              field: "text",
              input: {
                $arrayElemAt: [
                  { $filter: { input: "$name", cond: { $eq: ["$$this.language", "en-US"] } } },
                  0
                ]
              }
            }
          }
        ]
      }
    }
  }
])

如果后续需要新增其他优先级语言,只需要在$ifNull的参数数组中按优先级顺序新增对应语言的提取逻辑即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:24:04