Mongodb mongo db聚合中$set的动态字段路径

Mongodb mongo db聚合中$set的动态字段路径,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有包含多语言数据的文档。简化版本如下所示: { 语言:[ “嗯”, “fr” ], 标题:{ 恩:“烤土豆”, fr:“大地之光” }, } 重要部分包括: 标题包含形状中的翻译: 语言包含支持的语言列表,第一种是默认语言 并非所有文档都支持相同的语言 我想做的是查询该文档中的特定语言 如果支持该语言,则用正确的翻译替换标题对象 如果语言不可用,则将标题对象替换为默认翻译 用法语查询上述文件的I-e应返回{“title”:“Gratin de pomme de terre”}

我有包含多语言数据的文档。简化版本如下所示:

{
语言:[
“嗯”,
“fr”
],
标题:{
恩:“烤土豆”,
fr:“大地之光”
},    
}
重要部分包括:

  • 标题
    包含形状中的翻译
  • 语言
    包含支持的语言列表,第一种是默认语言
  • 并非所有文档都支持相同的语言
我想做的是查询该文档中的特定语言

  • 如果支持该语言,则用正确的翻译替换
    标题
    对象
  • 如果语言不可用,则将
    标题
    对象替换为默认翻译
用法语查询上述文件的I-e应返回
{“title”:“Gratin de pomme de terre”}
,如果用中文查询,应返回
{“title”:“马铃薯Gratin”}

我有一个游乐场设置:。我拥有它,因此它设置了输出应该在其中的
lang
属性。然后我希望有一个类似于
“$set”:{“title”:“$title.$lang”}
的阶段,但它抱怨字段路径组件不应该以
$
开头,我猜这意味着mongo不支持动态字段路径

你知道如何实现这样的目标吗

一些注意事项:

  • 在实际文档中,我有很多这样的字段,因此使用“$unwind”的解决方案成本高昂
  • 它以语言作为键进行结构的原因是它有助于使用Mongo Atlas进行索引。将结构更改为具有一系列翻译将损害应用程序的其他部分

您必须使用$objectToArray将对象转换为数组,过滤此数组并获取其中的元素0。然后,您可以转换回您的值

db.collection.aggregate([
  {
    "$match": {
      "_id": BinData(0, "3BByrilZQ2GTdlXG0nrGXw=="),
      
    },
  },
  {
    "$set": {
      "lang": {
        "$cond": [
          {
            "$in": [
              "zh",
              "$languages"
            ]
          },
          "zh",
          {
            "$first": "$languages"
          }
        ]
      }
    }
  },
  {
    $addFields: {
      title: {
        "$arrayElemAt": [
          {
            "$filter": {
              "input": {
                "$objectToArray": "$title"
              },
              "as": "title",
              "cond": {
                $eq: [
                  "$$title.k",
                  "$lang"
                ]
              }
            }
          },
          0
        ]
      }
    }
  },
  {
    $addFields: {
      title: "$title.v"
    }
  }
])
当然,您必须在代码中的两个位置都将'zh'作为参数传递


谢谢!我担心我会做那样的事。。。我想我将检索整个对象,并用客户机代码处理转换。我正在使用Golang驱动程序,为该管道创建对象将比编写转换代码更复杂。。。