Dynamic fields array in to single object mongo db

Viewed 54

I am having mongo collection like below,

{
   "_id" : ObjectId("62aeb8301ed12a14a8873df1"),
   "Fields" : [ 
    {
        "FieldId" : "e8efd0b0-9d10-4584-bb11-5b24f189c03b",
        "Value" : [ 
            "test_123"
        ]
    }, 
    {
        "FieldId" : "fa6745c2-b259-4a3b-8c6f-19eb78fbbbf5",
        "Value" : [ 
            "123"
        ]
    }, 
    {
        "FieldId" : "2a1be5d0-8fb6-4b06-a253-55337bfe4bcd",
        "Value" : []
    }, 
    {
        "FieldId" : "eed12747-0923-4290-b09c-5a05107f5609",
        "Value" : [ 
            "234234234"
        ]
    },        
    {
        "FieldId" : "fe41d8fb-fa18-4fe5-b047-854403aa4d84",
        "Value" : [ 
            "Irrelevan"
        ]
    }, 
    {
        "FieldId" : "93e46476-bf2e-44eb-ac73-134403220e9e",
        "Value" : [ 
            "test"
        ]
    }, 
    {
        "FieldId" : "db434aca-8df3-4caf-bdd7-3ec23252c2c8",
        "Value" : [ 
            "2019-06-16T18:30:00.000Z"
        ]
    }, 
    {
        "FieldId" : "00df903f-5d59-41c1-a3df-60eeafb77d10",
        "Value" : [ 
            "tewt"
        ]
    }, 
    {
        "FieldId" : "e97d0386-cd42-6277-1207-e674c3268cec",
        "Value" : [ 
            "1"
        ]
    },
    {
        "FieldId" : "35e55d27-7d2c-467d-8a88-09ad6c9f5631",
        "Value" : [ 
            "10"
        ]
    }
  ]
 }

This is all dynamic form fields. So I want to query and get result like to below object,

{
    "_id" : ObjectId("62aeb8301ed12a14a8873df1"),
    "e8efd0b0-9d10-4584-bb11-5b24f189c03b": ["test_123"],
    "fa6745c2-b259-4a3b-8c6f-19eb78fbbbf5": ["123"],
    "2a1be5d0-8fb6-4b06-a253-55337bfe4bcd": [],
    "eed12747-0923-4290-b09c-5a05107f5609": ["234234234"],
    "fe41d8fb-fa18-4fe5-b047-854403aa4d84": ["Irrelevan"],
    "93e46476-bf2e-44eb-ac73-134403220e9e":["test"],
    "db434aca-8df3-4caf-bdd7-3ec23252c2c8":["2019-06-16T18:30:00.000Z"],
    "00df903f-5d59-41c1-a3df-60eeafb77d10":["1"]
 }

I want final output like this combination of fields Fields.FieldID should be key and Fields.Value should be value here.

Please try to help to me to form the object like above.

Thanks in advance!

2 Answers

You can restructure your objects using $arrayToObject, then using that value to as a new root $replaceRoot like so:

db.collection.aggregate([
  {
    $match: {
      // your query here
    }
  },
  {
    $project: {
      newRoot: {
        "$arrayToObject": {
          $map: {
            input: "$Fields",
            in: {
              k: "$$this.FieldId",
              v: "$$this.Value"
            }
          }
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$newRoot",
          {
            _id: "$_id"
          }
        ]
      }
    }
  }
])

Mongo Playground

I try this and get result like you want

 db.collection.aggregate([{
    $replaceWith: {
      $mergeObjects: [
        {
          _id: "$_id"
        },
        {
          $arrayToObject: { $zip: {inputs: ["$Fields.FieldId","$Fields.Value"]}}
        }
      ]
    }
    }])

playground

Related