Search code examples
reactjsmongodbaggregateaggregation

want to group mongoDB documents by user. but after grouping, I don't want the user's mail field to appear again in the addresses. how?


My sample data:

[
    {
        'user': 'aa@hotmail.com',
        'AddressLine': 'jntgt',
        'vat': 'gfgf',
        'Companyname': 'gfgfg',
        'countryName': 'mexico',
        'AddressTitle': 'ev',
    },
    {
        'user': 'aa@hotmail.com',
        'AddressLine': 'gthh',
        'vat': 'gfgf',
        'Companyname': 'gfgfg',
        'countryName': 'usa',
        'AddressTitle': 'ev',
    },
    {
        'user': 'bb@hotmail.com',
        'AddressLine': 'gdgg',
        'vat': 'gfgf',
        'Companyname': 'ljjjhg',
        'countryName': 'Angola',
        'AddressTitle': 'ev',
    },
];

I want the result to look like this:

[
    {
        'user': 'aa@hotmail.com',
        'addresses': [
            {
                'AddressLine': 'jntgt',
                'vat': 'gfgf',
                'Companyname': 'gfgfg',
                'countryName': 'mexico',
                'AddressTitle': 'ev',
            },
            {
                'AddressLine': 'gthh',
                'vat': 'gfgf',
                'Companyname': 'gfgfg',
                'countryName': 'usa',
                'AddressTitle': 'ev',
            },
        ],
    },
    {
        'user': 'bb@hotmail.com',
        'addresses': [
            {
                'AddressLine': 'gdgg',
                'vat': 'gfgf',
                'Companyname': 'ljjjhg',
                'countryName': 'Angola',
                'AddressTitle': 'ev',
            },
        ],
    },
]

How should mongodb aggregation code be? I tried this:

[
    {
        $group: {
            _id: '$user',
            addresses: { $push: '$$ROOT' },
        },
    },
    {
        $project: {
            user: '$_id',
            addresses: 1,
        },
    },
];

ok. but The user I grouped in root appears again. how can i remove user when i group.


Solution

  • You can do this in multiple ways, the easiest way IMO is to just add another $project stage at the end that excludes that field, like so:

    db.collection.aggregate([
      {
        $group: {
          _id: "$user",
          addresses: {
            $push: "$$ROOT"
          }
        },
        
      },
      {
        $project: {
          user: "$_id",
          addresses: 1,
          
        }
      },
      {
        $project: {
          _id: 0,
          "addresses.user": 0
        }
      }
    ])
    

    Mongo Playground