python - 如何使用 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 可以采用不同的结构,不幸的是,我无法控制更改。
解决方案
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
实际对嵌套对象执行查询的运算符。
这是一个简单的示例,但使用聚合器操作员您有很大的灵活性。
推荐阅读
- css - 通过打字稿更改按钮单击时的svg颜色
- angularjs - ng-repeat 的每个元素的特定颜色
- mysql - 如何在变量中设置MySQL参数多个值
- authentication - 我可以使用 OAuth 对受信任的客户端(移动应用程序)进行身份验证吗?
- angular - 如何检查任何模型属性是否为空?
- java - 为什么不支持不同返回类型的重载
- mysql - TYPO3 9 LTS 类型转换错误在 mysql 时间字段上用于 TCA 类型输入/dbType 节省时间的空字段
- javascript - 如何在代码(node.js)中处理“进程内存不足后返回的 API 致命错误处理程序”?
- javascript - 在执行上下文的创建阶段如何加载 javascript 对象和 javascript 函数?
- ios - 如何在 iOS 中创建一个旋转的彩虹色圈