Python 按内部数组的特定元素分组
我正试图通过一次查询获得以下结果: 获取pub.type为deb、pub.name为Mzn的所有结果,并按pub.name对其进行分组,其中pub.type为cred 以下是示例数据:Python 按内部数组的特定元素分组,python,python-3.x,mongodb,group-by,mongodb-query,Python,Python 3.x,Mongodb,Group By,Mongodb Query,我正试图通过一次查询获得以下结果: 获取pub.type为deb、pub.name为Mzn的所有结果,并按pub.name对其进行分组,其中pub.type为cred 以下是示例数据: [ { "addr": "address1", "book": "book1", "pub": [ { "type": "deb", "name": "Mzn" }, { "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
块内工作正常,第二部分则不正常。它是按数组对数据进行分组,但我希望它按数组对象的元素对数据进行分组,在数组对象中它应该满足特定条件(我前面已经写过)
我曾尝试使用$unwind
,但它只是将其拆分为数组中每个元素的对象
这是上述查询生成的结果:
这就是我需要的结果:
非常感谢您的帮助。下面的内容似乎是获得答案的一种迂回方式,但这对我很有用 解卷
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"
}
}
}
}
])
“所需结果”中的json数据是您需要的最终输出,还是“按pub.name将它们分组,其中pub.type是cred”?
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"
}
}
}
}
])