mongodb - mongo db 聚合中 $set 的动态字段路径
问题描述
我有包含多语言数据的文档。简化版本如下所示:
{
languages: [
"en",
"fr"
],
title: {
en: "Potato Gratin",
fr: "Gratin de pomme de terre"
},
}
重要的部分是:
title
包含形状中的翻译<lang> : <text>
languages
包含支持的语言列表,第一个是默认语言。- 并非所有文档都支持相同的语言
我想做的是查询该文档以获取特定语言,或者
title
如果语言受支持,则用正确的翻译替换对象title
如果语言不是,则用默认翻译替换对象
即用法语查询上述文档应该返回{"title": "Gratin de pomme de terre"}
,如果用中文查询,它应该返回{"title": "Potato Gratin"}
我有一个游乐场设置:https ://mongoplayground.net/p/CP0Z20dTpgy 。我有它,以便它设置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”作为参数传递给您的代码。
推荐阅读
- c - 从文件中读取密文时,Openssl EVP API 无法解密密文(AES 128 ecb)
- linker - 搬迁超出范围;R_AARCH64_ADR_PREL_PG_HI21;通过链接器脚本变量;
- python - 上下文菜单 - 在嵌套的 QMenus 中重命名
- neo4j - 这个密码中时间字段的格式是什么?
- excel - 颜色行以匹配特定的单元格颜色
- rest - 处理用户在 API 响应中输入所有可选参数之一的情况
- google-chrome-extension - chrome.topSites 扩展 API 如何计算访问次数最多的 URL?
- mysql - FREEBSD mysql报错表打开缓存报错
- java - Selenium - 每行中的意外行为发现元素
- c# - kinect 或 realsense 等相机的深度数据是什么?