Mongodb-在深度嵌套的数组中查找

时间:2020-05-18 10:05:01

标签: arrays mongodb pymongo

我正在尝试查找给定的rs中是否存在type = conv,而rs在d-> ds-> rs->类型中存在。

文档

{
    "_id" : ObjectId("5ec25873bd796ff191e695b1"),
    "c_name" : "c1",
    "t_name" : "t1",
    "d" : [ 
        {
            "name" : "d1",
            "ds" : [ 
                {
                    "name" : "ds1",
                    "rs" : [ 
                        {
                            "type" : "conv"
                        }
                    ]
                }
            ]
        }, 
        {
            "name" : "d2",
            "ds" : [ 
                {
                    "name" : "ds2",
                    "rs" : []
                }
            ]
        }
    ]
}

查询


filter = {
    "$and": [
        {"c_name": {'$eq': 'c1'}},
        {"t_name": {'$eq': 't1'}},
        {"d.name": {'$eq': 'd2'}},
        {"d.ds.name": {'$eq': 'ds2'}},
        {"d.ds.rs.type": {'$eq': 'conv'}}

    ]
}

输出

它正在返回我的文档,我想它是在整个文档中寻找type = conv的存在,即使它不存在于ds2(d2的一部分)上,而是存在于ds1(d1的一部分)上。

我们有没有更简单的方法来找到它是否存在,我想先找到然后使用数组过滤器,我们可以更新深度嵌套数组中的特定元素。

有人可以建议我该如何解决这个问题? (如果我们有任何不使用聚合的解决方案)

2 个答案:

答案 0 :(得分:1)

对于这些类型的条件,您需要使用 $ elemMatch ,并且无需$ eq运算符即可匹配字符串

filter = {"$and": [
    {"c_name": "c1"},
    {"t_name": "t1"},
    { "d": { $elemMatch: { "name": "d2", "ds.name": "ds2" , "ds.rs.type": "conv"} } }
]}

使用$ elemMatch仅在所有条件都为真的数组中搜索

答案 1 :(得分:0)

感谢@puneet,我需要在上面尝试。但是,我现在正在使用这个

filter_query = {
                "$and": [
                    {"c_name": {'$eq': 'c1'}},
                    {"t_name": {'$eq': 't1'}},
                    {
                        'd': {
                            '$elemMatch': {
                                'name': 'd2',
                                'ds': {
                                    '$elemMatch':
                                        {'name': 'ds2',
                                         'rs':
                                             {'$elemMatch':
                                                 {
                                                     "type": 'conv'}
                                             }
                                         }
                                }
                            }
                        }
                    }]}

这也有效!