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

问题描述 投票:0回答:1

我试图寻找在给定的rs中是否存在type=conv,它存在于d--> ds--> rs--> type。

DOCUMENT

{
    "_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'}}

    ]
}

OUTPUT

它正在返回我的文档,我想它正在寻找类型=conv在完整文档中的存在,即使它不存在于ds2(d2的一部分),但存在于ds1(d1的一部分)。

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

谁能告诉我应该如何解决这个问题?(如果我们有不使用聚合的解决方案的话)

arrays mongodb pymongo
1个回答
1
投票

你需要使用 $elemMatch 对于这些类型的条件,你可以在没有$eq操作符的情况下匹配字符串。

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

使用$elemMatch,它将只在所有条件为真的数组中进行搜索。


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'}
                                             }
                                         }
                                }
                            }
                        }
                    }]}

这也是工作!!!!!!!!!!。

© www.soinside.com 2019 - 2024. All rights reserved.