gpt4 book ai didi

MongoDB 聚合 : add field from an embedded document via a dynamic field path

转载 作者:行者123 更新时间:2023-12-01 21:46:09 27 4
gpt4 key购买 nike

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

{
_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" }
])

Mongo playground

关于MongoDB 聚合 : add field from an embedded document via a dynamic field path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60448849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com