MongoDB 聚合:通过动态字段路径从嵌入文档添加字段

2023-12-07

我有一个聚合管道,但被困在舞台上。此时我有一个以下格式的文档:

{
  _id:ObjectId(5e3d326637df7e4dda73ec22),
  levelName:"Level 1",
  levelNames: {
    "Level 1":"5e567993b6ed4b7b4d2c044d"
    "Level 2":"5e567996a7826d45f836dfa3"
    "Level 3":"5e5679991f515a01c73e9006"
  }
}

我想添加一个 $addField/$set 阶段,它为我提供 levelNames 对象中条目的 ID 值,其键与根文档的 levelName 属性匹配。

我一直在尝试使用某种动态字段路径 ($concat: ["levelNames.", "$levelName"]) 但没有运气。这是我的 $addField 阶段:

/**
 * newField: The new field name.
 * expression: The new field expression.
 */
{
  currentLevelId: {
    $let: {
      vars: {
        levelPath: {
          $concat: ["levelNames.", "$levelName"]
        }
      },
      in: {
        currentLevelId: "$$levelPath"
      }
    }
  }
}

我得到的结果是:

{
  _id:ObjectId(5e3d326637df7e4dda73ec22),
  levelName:"Level 1",
  levelNames: {
    "Level 1":"5e567993b6ed4b7b4d2c044d"
    "Level 2":"5e567996a7826d45f836dfa3"
    "Level 3":"5e5679991f515a01c73e9006"
  }
  currentLevelId: {
    currentLevelId:"levelNames.Level 1"
  }
}

我试图将 currentLevelId 的结果设为“5e567993b6ed4b7b4d2c044d”,所以我想要的输出是:

{
  _id:ObjectId(5e3d326637df7e4dda73ec22),
  levelName:"Level 1",
  levelNames: {
    "Level 1":"5e567993b6ed4b7b4d2c044d"
    "Level 2":"5e567996a7826d45f836dfa3"
    "Level 3":"5e5679991f515a01c73e9006"
  },
  currentLevelId: "5e567993b6ed4b7b4d2c044d"
}

有没有办法可以实现这一点?


使用这个:

db.collection.aggregate([
   { $set: { data: { $objectToArray: "$levelNames" } } },
   {
      $set: {
         currentLevelId: {
            $arrayElemAt: ["$data.v", { $indexOfArray: ["$data.k", "$levelName"] }]
         }
      }
   },
   { $unset: "data" }
])

蒙戈游乐场

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 聚合:通过动态字段路径从嵌入文档添加字段 的相关文章

随机推荐