Thursday 4 May 2017

How to flatten an array after db call in express?

I am using express to query my mongodb database using the native driver (not Mongoose.)

I am trying to do some data clean up after a MongoDB response. I don't mind if this could be achieved with MongoDB's aggregation query or some variation of it, for completeness the current query I'm using is: collection.find({'make.name': req.params.make}, {'model.name': 1, 'submodel.body': 1, '_id': 0}).toArray();

I have a response from mongodb:

[
            {
                    "model" : {
                            "name" : "3 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "3 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "3 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            }
    ]

which I would like to simplify to this:

[
 "model" : {
   "name": "2 Series"
  }

 "submodel" : {
   "body": ["Convertible", "Coupe"]
  }

 "model" : {
   "name": "3 Series"
  }

 "submodel" : {
   "body": ["Convertible", "Coupe"]
  }
]

As you can see, model.name is a unique property, and "submodel.body" is now an array of unique body types.

How can I convert my array of non-unique models, to an array of unique models?



via Moshe

No comments:

Post a Comment