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:“大地之光”
},
}
重要部分包括:
包含形状中的翻译标题
:
包含支持的语言列表,第一种是默认语言语言
- 并非所有文档都支持相同的语言
- 如果支持该语言,则用正确的翻译替换
对象标题
- 如果语言不可用,则将
对象替换为默认翻译标题
{“title”:“Gratin de pomme de terre”}
,如果用中文查询,应返回{“title”:“马铃薯Gratin”}
我有一个游乐场设置:。我拥有它,因此它设置了输出应该在其中的lang
属性。然后我希望有一个类似于“$set”:{“title”:“$title.$lang”}
的阶段,但它抱怨字段路径组件不应该以$
开头,我猜这意味着mongo不支持动态字段路径
你知道如何实现这样的目标吗
一些注意事项:
- 在实际文档中,我有很多这样的字段,因此使用“$unwind”的解决方案成本高昂
- 它以语言作为键进行结构的原因是它有助于使用Mongo Atlas进行索引。将结构更改为具有一系列翻译将损害应用程序的其他部分
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驱动程序,为该管道创建对象将比编写转换代码更复杂。。。