Search code examples
mongodbaggregation-framework

Replace root document with array using MongoDB 4


My aggregation pipeline is a document with a single field result that contains an array, like this:

[
  {
    "result": [
      {
        "meteoEventType": "RAIN",
        "meteoEventLabel": "PRECIPITAZIONE",
        "meteoEventLevel": "LOW",
        "meteoEventLevelLabel": "Forte pioviggine"
      },
      {
        "meteoEventType": "HAIL",
        "meteoEventLabel": "GRANDINE",
        "meteoEventLevel": "MEDIUM",
        "meteoEventLevelLabel": "Probabilità moderata"
      },
      {
        "meteoEventType": "INUNDATION",
        "meteoEventLabel": "ALLAGAMENTI",
        "meteoEventLevel": "LOW",
        "meteoEventLevelLabel": "Probabilità molto bassa"
      },
      {
        "meteoEventType": "WIND",
        "meteoEventLabel": "VENTO",
        "meteoEventLevel": "LOW",
        "meteoEventLevelLabel": "Calma"
      }
    ]
  }
]

What I need to achieve is something like this, without the result field:

[
      {
        "meteoEventType": "RAIN",
        "meteoEventLabel": "PRECIPITAZIONE",
        "meteoEventLevel": "LOW",
        "meteoEventLevelLabel": "Forte pioviggine"
      },
      {
        "meteoEventType": "HAIL",
        "meteoEventLabel": "GRANDINE",
        "meteoEventLevel": "MEDIUM",
        "meteoEventLevelLabel": "Probabilità moderata"
      },
      {
        "meteoEventType": "INUNDATION",
        "meteoEventLabel": "ALLAGAMENTI",
        "meteoEventLevel": "LOW",
        "meteoEventLevelLabel": "Probabilità molto bassa"
      },
      {
        "meteoEventType": "WIND",
        "meteoEventLabel": "VENTO",
        "meteoEventLevel": "LOW",
        "meteoEventLevelLabel": "Calma"
      }
    ]

Considering that I am using MongoDB 4, how can I get rid of the result field?

The $replaceWith stage can't work because result is not a document.


Solution

  • You need the $unwind stage to deconstruct the result array before the $replaceWith stage.

    db.collection.aggregate([
      {
        $unwind: "$result"
      },
      {
        $replaceWith: "$result"
      }
    ])
    

    Demo @ Mongo Playground