Home > Blockchain >  Grouping With aggregation in MongoDB
Grouping With aggregation in MongoDB

Time:05-25

Currently I'm using aggregation in MongoDB. There is a field with province and religion in my collections. I'm doing this

const data = await submit.aggregate([
    { "$group": { _id: { province: "$province" ,religion:"$religion"}, count: { $sum: 1 } } },
  ])

My output Looks like this:

[
  { _id: { religion: 'a', province: 'aa' }, count: 1 },
  { _id: { religion: b, province: 'bb' }, count: 2 },
  { _id: { religion: 'c', province: 'bb'}, count: 2 },
  { _id: { religion: 'd', province: 'cc' }, count: 1 } 
]

Expect Output:

[
  { _id: { religion: 'a ' }, count: 1 },
  { _id: { religion: 'a' }, count: 1 },
  { _id: { religion: null }, count: 6 },
  { _id: { religion: 'c' }, count: 1 },
  { _id: { religion: 'd' }, count: 2 },
  { _id: { religion: 'e' }, count: 6 },
  { _id: { religion: 'f' }, count: 15 },
  { _id: { religion: 'g' }, count: 2 },
 
 
] [
  { _id: { province: 'aa' }, count: 19 },
  { _id: { province: 'bb' }, count: 2 },
  { _id: { province: 'cc' }, count: 21 },
  
]

CodePudding user response:

You seek 2 different $group at the same time -- this is exactly what $facet is for. Think of $facet like "multi-group." Given an input set similar to the following:

    { religion: 'a', province: 'aa' },
    { religion: 'b', province: 'aa' },
    { religion: 'c', province: 'aa' },
    { religion: 'c', province: 'bb' },
    { religion: 'd', province: 'bb' },
    { religion: 'e', province: 'cc' },      
    { religion: 'f', province: 'aa' },
    { religion: 'f', province: 'aa' },
    { religion: 'f', province: 'aa' },
    { religion: 'f', province: 'cc' }

Then this pipeline:

db.foo.aggregate([
    {$facet: {
        "by_religion": [
            {$group: {_id: '$religion', N:{$sum:1}}}
        ],
        "by_province": [
            {$group: {_id: '$province', N:{$sum:1}}}
        ],
    }}  
]);

yields this output:

{
    "by_religion" : [
        {
            "_id" : "b",
            "N" : 1
        },
        {
            "_id" : "e",
            "N" : 1
        },
        {
            "_id" : "d",
            "N" : 1
        },
        {
            "_id" : "a",
            "N" : 1
        },
        {
            "_id" : "f",
            "N" : 4
        },
        {
            "_id" : "c",
            "N" : 2
        }
    ],
    "by_province" : [
        {
            "_id" : "bb",
            "N" : 2
        },
        {
            "_id" : "cc",
            "N" : 2
        },
        {
            "_id" : "aa",
            "N" : 6
        }
    ]
}
  • Related