Search code examples
mongodbmongodb-queryaggregation-frameworkaggregateaggregation

Mongodb 2 collections aggregation


Summarize points in second collection and put it in the first collection

given two collections:

a:

    {
     _id: 123323525245,
     token: "token_1",
     points: 0
    },
    {
     _id: 3454545334
     token: "token_2"
     points: 0
    }

b:

    _id: 1324454:
    lines: [
    {
      token: "token_1",
      points: 20
    },
    {
      token: "token_1",
      points: 10
    },
    {
      token: "token_2",
      points: 12
    }
  ]

I want to summarize all the points in collection b by token, and put it in a collection expected a collection:

a:
    {
       _id: 123323525245,
       token: "token_1",
       points: 30
    },
    {
       _id: 3454545334
       token: "token_2"
       points: 12
    }

What query should I use?


Solution

  • Unwind collection b first, and then group by token.

    db.b.aggregate([
      {
        "$unwind": "$lines"
      },
      {
        "$group": {
          "_id": "$lines.token",
          "points": {
            "$sum": "$lines.points"
          }
        }
      },
      {
        "$lookup": {
          "from": "a",
          "localField": "_id",
          "foreignField": "token",
          "as": "docs"
        }
      },
      {
        "$project": {
          "_id": {
            "$first": "$docs._id"
          },
          "points": "$points",
          "token": "$_id"
        }
      }
    ])
    

    mongoplayground