bc110402922
bc110402922

Reputation: 457

get the relevant information against the object value in MongoDB

Explanation : A , B , C object have values. I have to match only those values with dic.data objects name. if its not match the then get the exception "No error found". see the Expected_output. A B C get the relvant information.

I am using lookup to get dic data.

Note this should be handle dynamically. A B C values may differ, that impact on Expected_output

{
  "_id": {
    "A": "31",
    "B": "40",
    "C": "7"
  },
  "dic": [
    {
      "_id": "5487",
      "data": {
        "A": {
          "31": {
            "name": "NoFile"
          },
          "32": {
            "name": " -- "
          }
        },
        "B": {
          "40": {
            "label": "Label",
            "description": "Error1"
          },
          "41": {
            "label": " Data collection ",
            "description": "error"
          }
        },
        "C": {
          "4": {
            "description": "High problem"
          },
          "7": {
            "description": " Normal"
          }
        }
      }
    }
  ]
}
  "Expected_output": {
    "A": {
 "name" :"NoFile",
 "code" : "31"
},
    "B":{
 "label" : "Label",
 "description" : "Error1",
 "code" : "40"

},
    "C": {
 "description" : "Normal",
  "code" : "7"
} 
  }

Upvotes: 1

Views: 56

Answers (1)

turivishal
turivishal

Reputation: 36104

  • $arrayElemAt to get first element from dic array
  • $objectToArray convert A object to array
  • $reduce to iterate loop of element above converted array and check condition if _id.A matches with data A then return specific field,
  • do the same process for B and C
db.collection.aggregate([
  {
    $addFields: {
      dic: { $arrayElemAt: ["$dic", 0] }
    }
  },
  {
    $project: {
      _id: 1,
      dic: {
        A: {
          $reduce: {
            input: { $objectToArray: "$dic.data.A" },
            initialValue: "Not Found",
            in: {
              $cond: [
                { $eq: ["$$this.k", "$_id.A"] },
                "$$this.v.name",
                "$$value"
              ]
            }
          }
        },
        B: {
          $reduce: {
            input: { $objectToArray: "$dic.data.B" },
            initialValue: "Not Found",
            in: {
              $cond: [
                { $eq: ["$$this.k", "$_id.B"] },
                "$$this.v.description",
                "$$value"
              ]
            }
          }
        },
        C: {
          $reduce: {
            input: { $objectToArray: "$dic.data.C" },
            initialValue: "Not Found",
            in: {
              $cond: [
                { $eq: ["$$this.k", "$_id.C"] },
                "$$this.v.description",
                "$$value"
              ]
            }
          }
        }
      }
    }
  }
])

Playground

Upvotes: 1

Related Questions