如何使用PyMongo find()搜索嵌套数组属性?

时间:2018-11-21 15:30:36

标签: python json mongodb pymongo

使用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的结构可以不同,但​​是很遗憾,这不在我的控制范围之内。

1 个答案:

答案 0 :(得分:0)

1。返回prod_attr.hierarchy.subclass =“ 2022”

的所有文档

基于MongoDB的Query an Array of Embedded Documents文档,您可以使用点符号将数组字段的名称(a)与点(df['c'] = df.groupby('cut')['a'].transform(lambda x: ','.join(map(str, x.values.tolist()))) df.drop('cut', axis = 1) a b c 0 1 1 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1... 1 2 2 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1... 2 3 3 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1... 3 4 4 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1... 4 5 5 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1... )和字段名称连接在一起在嵌套文档(prod_attr)中:

.

2。返回prod_attr.name包含“运动鞋”的所有文档

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

hierarchy.subclass

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

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

collection.find({"prod_attr.name": {"$regex": "Sneaker"}}) 运算符为collection.aggregate([ {"$unwind": "$prod_attr"}, {"$match": {"prod_attr.hierarchy.subclass": "2022"}} ]) 数组中的每个对象创建一个新对象,因此您将仅具有嵌套文档,而没有数组(有关详细信息,请检查documentation)。
下一步是$unwind运算符,它实际上对嵌套对象执行查询。

这是一个简单的示例,但是在使用Aggregators Operators时您具有很大的灵活性。