首页 > 解决方案 > 如何使用 PyMongo find() 搜索嵌套数组属性?

问题描述

使用 PyMongo,如何查找/搜索嵌套数组 json 对象与给定字符串匹配的文档。

给定 MongoDB 集合中的以下 2 个产品 JSON 文档。

[{
    "_id" : ObjectId("5be1a1b2aa21bb3ceac339b0"),
    "id" : "1",
    "prod_attr" : [ 
        {
            "name" : "Branded X 1 Sneaker"
        },  
        {
            "hierarchy" : {
                "dept" : "10",
                "class" : "101",
                "subclass" : "1011"
            }
        }
    ]
},
{
    "_id" : ObjectId("7be1a1b2aa21bb3ceac339xx"),
    "id" : "2",
    "prod_attr" : [ 
        {
            "name" : "Branded Y 2 Sneaker"
        },  
        {
            "hierarchy" : {
                "dept" : "10",
                "class" : "101",
                "subclass" : "2022"
            }
        }
    ]
}
]

我想 1. 返回 prod_att.hierarchy.subclass = "2022" 的所有文档 2. 返回 prod_attr.name 包含 "Sneaker" 的所有文档

我很欣赏 JSON 可以采用不同的结构,不幸的是,我无法控制更改。

标签: pythonjsonmongodbpymongo

解决方案


1.返回prod_attr.hierarchy.subclass = "2022"的所有文档

根据 MongoDB 的Query an Array of Embedded Documents文档,您可以使用点表示法将数组字段的名称 ( prod_attr)、点 ( .) 和嵌套文档中的字段名称 ( hierarchy.subclass) 连接起来:

collection.find({"prod_attr.hierarchy.subclass": "2022"})

2. 返回prod_attr.name 包含“Sneaker”的所有文档

和以前一样,您可以使用点表示法来查询数组中嵌套元素的字段。要执行“包含”查询,您必须使用$regex运算符:

collection.find({"prod_attr.name": {"$regex": "Sneaker"}})

另一种选择是使用 MongoDB聚合框架

collection.aggregate([
    {"$unwind": "$prod_attr"},
    {"$match": {"prod_attr.hierarchy.subclass": "2022"}}
])

运算符为数组$unwind中的每个对象创建一个新对象prod_attr,因此您将只有嵌套文档而没有数组(有关详细信息,请查看文档)。
下一步是$match实际对嵌套对象执行查询的运算符。

这是一个简单的示例,但使用聚合器操作员您有很大的灵活性。


推荐阅读