Home > Software engineering >  Dynamic fields array in to single object mongo db
Dynamic fields array in to single object mongo db

Time:06-20

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!

CodePudding user response:

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

  • Related