python - 按内部数组的特定元素分组
问题描述
我正在尝试通过单个查询来实现如下所述的结果:
获取pub.type为deb且pub.name为Mzn的所有结果,并按pub.name将它们分组,其中pub.type为cred
这是示例数据:
[
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "Alf"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "Alf"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "All"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "All"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "All"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "Hab"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Hab"
},
{
"type": "cred",
"name": "Alf"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Hab"
},
{
"type": "cred",
"name": "Alf"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "All"
},
{
"type": "cred",
"name": "Alf"
}
]
},
{
"addr": "address1",
"book": "book1",
"pub": [
{
"type": "deb",
"name": "Mzn"
},
{
"type": "cred",
"name": "Hab"
}
]
}
]
到目前为止,我已经来到下面写的查询。第一部分在$match
块内工作正常,第二部分不是。它是按数组对数据进行分组,但我希望它按数组对象的元素对数据进行分组,它应该满足特定条件(我之前已经写过)。
db.collection.aggregate(
[
{
"$match":{
"pub":{
$elemMatch:{
"type":"deb", //This part is working fine
"name":"Mzn"
}
}
}
},
{
"$group":{
"_id":{
"object":"$pub.name"
},
"object":{
"$push":"$$ROOT"
}
}
}
])
我曾尝试使用$unwind
,但它只是将其拆分为数组每个元素的对象。
这是上面查询生成的结果:result by above query
这是我需要的结果:期望的结果
非常感谢任何帮助。
解决方案
以下似乎是获得答案的迂回方式,但这对我有用。
展开pub1
可能会增加大型数据集的问题
db.getCollection('books').aggregate( [
{
"$match":{
"pub":{
$elemMatch:{
"type":"deb",
"name":"Mzn"
}
}
}
},
{
"$project":{
"_id":"$_id",
"addr":"$addr",
"book":"$book",
"pub":"$pub",
"pub1":"$pub"
}
},
{
"$unwind":'$pub1'
},
{
"$match":{
"pub1.type":"cred"
}
},
{
"$group":{
"_id":{
"name":"$pub1.name"
},
"object":{
"$push":{
"_id":"$$ROOT._id",
"addr":"$$ROOT.addr",
"book":"$$ROOT.book",
"pub":"$$ROOT.pub"
}
}
}
}
])
推荐阅读
- java - 从网页获取 Java 或 C 程序的输入?
- c++ - Python实现不适用于c ++中的相同逻辑
- javascript - 在鼠标右键单击时禁用上下文菜单
- python - pip 安装前的 conda
- html - 尽管 Div 大小保持边界半径一致
- sql - 两列 SQL 之间的天数
- c# - WCF C# 系统初始化失败
- javascript - 在 ReactJS 中修改 state 对象直接重新渲染组件
- jquery - 如何序列化表单数据以包含子集合?
- rx-java2 - RxJava2 connectableObservables - autoConnect(2) - 为什么不等待 2 个订阅者调用 connect?