skip to Main Content

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


  1. 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

    Login or Signup to reply.
  2. I try this and get result like you want

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

    playground

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search