将文档置于集合test
中,如下所示:
{a:1, list:[{lang:"en", value:"Mother"}, {lang:"de", value:"Mutter"}] }
{a:2, list:[{lang:"en", value:"Iddqd"}] }
我想构建尝试将list.value
与所选语言匹配的查询,但如果它不存在则返回list
的任意可用项,例如上面的查询语言{{1我需要得到de
:
$projection
服务器版本:MongoDB 3.2 +
答案 0 :(得分:1)
您需要过滤列表,使用$let
运算符将结果分配给变量。如果变量是空列表,则使用$arrayElemAt
运算符返回给定值。在这种情况下,我只返回第一个子文档。
db.coll.aggregate([
{ "$project": {
"a": 1,
"label": {
"$let": {
"vars": {
"values": {
"$arrayElemAt": [
{ "$filter": {
"input": "$list",
"as": "lst",
"cond": { "$eq": [ "$$lst.lang", "de" ] }
}},
0
]
}
},
"in": {
"$ifNull": [
"$$values.value",
{ "$let": {
"vars": {
"default": {
"$arrayElemAt": [ "$list", 0 ]
}
},
"in": "$$default.value"
}}
]
}
}
}
}}
])