【问题标题】:Mongodb - Find in deeply nested arrayMongodb - 在深度嵌套的数组中查找
【发布时间】:2020-05-18 10:05:01
【问题描述】:

我正在尝试查找 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 的一部分)上。

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

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

【问题讨论】:

  • 您可以使用$ projection operator获取结果。
  • @prasad_ - 1. 投影不能用于多层嵌套数组。 2.问题主要是查找给定 d --> ds--> rs 的元素 type=conv 是否存在,它是根据我正在使用的过滤器找到它,因为 type 存在另一个 d-->ds
  • "1.投影不能用于多层嵌套数组。"可以使用。
  • 您能否提供一个基于上述过滤器的示例,我可以尝试确认与您对齐吗?

标签: arrays mongodb pymongo


【解决方案1】:

您需要使用 $elemMatch 来处理这些类型的条件,并且您可以在没有 $eq 运算符的情况下匹配字符串

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

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

【讨论】:

    【解决方案2】:

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

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

    这也有效!

    【讨论】:

    • 很好,您正在检查每个杠杆的状况,是的,这取决于要求:)
    • 乐于助人:)
    • 谢谢,确实,数组元素不是唯一的,可以跨不同的数组索引定位。
    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 2021-01-18
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-07-21
    • 2020-09-24
    相关资源
    最近更新 更多