我需要帮助以在mongodb中建立聚合管道。
我正在使用的mongodb版本是4。
存储在数据库中的文档如下:
[{
_id : "xxxxxx",
names : [
{ "lang" : "EN", value : "foo" },
{ "lang" : "IT", value : "bar" },
{ "lang" : "NOLANG", value : "baz" }
],
some : "value"
},{
_id : "yyyyyy",
names : [
{ "lang" : "FR", value : "quux" },
{ "lang" : "IT", value : "quuux" },
{ "lang" : "NOLANG", value : "quuuux" }
],
some : "value"
}]
我需要添加一个包含某种语言值的聚合字段(在此示例中,我将使用“ EN”),如果未找到具有请求语言的元素,则需要获取“ NOLANG”对象值
因此,聚合的结果必须类似于:
[{
_id : "xxxxxx",
name : "foo",
some : "value"
},{
_id : "yyyyyy",
name : "quuuux",
some : "value"
}]
这是我写的管道:
[
{
$project : {
names : 0,
name: {
$filter: {
input: '$names',
as: 'name',
cond: {
$switch: {
$branches: [
{
case : {
$eq : ["$$name.lang", "EN"]
},
then : "$$name.value"
} ,{
case : {
$eq : ["$$name.lang", "NOLANG"]
},
then : "$$name.value"
}
],
default : ''
}
}
}
}
}
}
]
它给了我错误:预期为“ [”或AggregationStage,但找到了“ {”。
我做错了什么?有人可以帮我吗?
谢谢
答案 0 :(得分:1)
您可以使用以下汇总
db.collection.aggregate([
{ "$project": {
"some": 1,
"name": {
"$arrayElemAt": [
"$names.value",
{
"$cond": [
{
"$ne": [
{ "$indexOfArray": ["$names.lang", "EN"] },
-1
]
},
{ "$indexOfArray": ["$names.lang", "EN"] },
{ "$indexOfArray": ["$names.lang", "NOLANG"] }
]
}
]
}
}}
])
[
{
"_id": "xxxxxx",
"name": "baz",
"some": "value"
},
{
"_id": "yyyyyy",
"name": "quuuux",
"some": "value"
}
]