Search code examples
arraysmongodbsum

MongoDB: find sum of nested array elements


Let's say I have a Customer document like the following

db.collection.insertOne( {
      "customerName": "John Doe",
      "orders": [
        {
          "type": "regular",
          "items": [
            {
              "name": "itemA",
              "price": 11.1
            },
            {
              "name": "itemB",
              "price": 22.2
            }
          ]
        },
        {
          "type": "express",
          "items": [
            {
              "name": "itemC",
              "price": 33.3
            },
            {
              "name": "itemD",
              "price": 44.4
            }
          ]
        }
      ]
  })

How can I calculate the total price of all orders (111 in this example)?


Solution

  • You can $unwind twice (because nested array) and group using $sum like this:

    db.collection.aggregate([
      {
        "$unwind": "$orders"
      },
      {
        "$unwind": "$orders.items"
      },
      {
        "$group": {
          "_id": "$customerName",
          "total": {
            "$sum": "$orders.items.price"
          }
        }
      }
    ])
    

    Example here