查询嵌套数组的特定元素或默认

时间:2016-09-29 16:06:15

标签: mongodb mongodb-query aggregation-framework

将文档置于集合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 +

1 个答案:

答案 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" 
                        }}
                    ]
                }
            }
        }
    }}
])