我试图通过单个查询实现如下所述的结果:
Get all results where pub.type is deb and pub.name is Mzn and group them by pub.name where pub.type is 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 block 内工作正常,第二部分则不然。它按数组对数据进行分组,但我希望它按数组对象的元素对数据进行分组,其中它应该满足特定条件(我之前已经写过)。
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
这是我需要的结果:desired result
非常感谢任何帮助。
最佳答案
下面似乎是获得答案的迂回方式,但这对我有用。
展开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"
}
}
}
}
])
关于python - 按内部数组的特定元素分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028654/