需求,有五个数组字段,数组里面是一个个对象,对象有一个相同的属性字段,对该字段分组:
结果:
aggregate语句:
db.tablename.aggregate()
.match({companyName:{$in:["xxxxxxxxxxx"]}})
.project({"influenceRisks.riskPoint": 1,"incomeRisks.riskPoint":1, "complaintRisks.riskPoint": 1,"adverRisks.riskPoint":1,"illegalRisks.riskPoint":1})
//$setUnion 把多个字段组合成一个之后再unwind
.project({risks: {$setUnion: ["$influenceRisks","$incomeRisks","$complaintRisks","$adverRisks","$illegalRisks"]}})
.project({"risks":"$risks.riskPoint"})
.unwind("$risks")
.group({
_id: "$risks",
count: { $sum: 1}
})
.sort({"count": -1})
.limit(40)
db.tablename.aggregate(
[{ "$match" : { "companyName" : { "$in" : ["xxxxxxxxxx"] } } },
{ "$project" :
{'influenceRisks.riskPoint': 1,'incomeRisks.riskPoint':1, 'complaintRisks.riskPoint': 1,'adverRisks.riskPoint':1,'illegalRisks.riskPoint':1,
risks: {$setUnion: ['$influenceRisks','$incomeRisks','$complaintRisks','$adverRisks','$illegalRisks']},
"risk":"$risks.riskPoint"}},
{ "$unwind" : "$risk" }, { "$group" : { "_id" : "$risk", "count" : { "$sum" : 1 } } }, { "$sort" : { "count" : -1 } },{ "$limit" : 40 }]
)
mongoTemplate 的api没有组装出来,然后…
很不优雅
private static String pipline = "{aggregate: 'tablename', pipeline:[{ '$match' : { 'companyName' : { '$in' : ['nameStr'] } } }, \n" +
"{ '$project' : \n" +
"{'influenceRisks.riskPoint': 1,'incomeRisks.riskPoint':1, 'complaintRisks.riskPoint': 1,'adverRisks.riskPoint':1,'illegalRisks.riskPoint':1,\n" +
"risks: {$setUnion: ['$influenceRisks','$incomeRisks','$complaintRisks','$adverRisks','$illegalRisks']},\n" +
"'risk':'$risks.riskPoint'}},\n" +
"{ '$unwind' : '$risk' }, { '$group' : { '_id' : '$risk', 'count' : { '$sum' : 1 } } }, { '$sort' : { 'count' : -1 } },{ '$limit' : 50 }]}";
//todo 传参进去把nameStr替换调
Document document = mongoTemplate.executeCommand(pipline)