0
点赞
收藏
分享

微信扫一扫

mongodb合并多个数组字段 并对数组里一个对象的属性进行分组

快乐码农Alan007 2022-02-16 阅读 156
mongodb

需求,有五个数组字段,数组里面是一个个对象,对象有一个相同的属性字段,对该字段分组:
在这里插入图片描述
结果:
在这里插入图片描述
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: 'machineAllocation', 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)
举报

相关推荐

0 条评论