使用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的结构可以不同,但是很遗憾,这不在我的控制范围之内。
答案 0 :(得分:0)
基于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
)中:
.
和以前一样,您可以使用点表示法查询数组内嵌套元素的字段。
要执行“包含”查询,您必须使用$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时您具有很大的灵活性。