Convert mongo array to an object with a key-value pair

I have a mongo document containing an array of strings, and I need to convert this particular array of strings to an array of an object containing a key-value pair. Below is my current rating.

{
    "_id" : ObjectId("57e3720836e36f63695a2ef2"),
    "platform" : "A1",
    "available" : {
        "Community" : {
            "attributes" : {
                "type" : {
                    "values" : [
                        "well-known",
                        "simple",
                        "complex"
                    ],
                    "defaultValue" : "well-known"
                },
[......]


}

Current request:

templateAttributes.find({platform:"V1"}).map(function(c){
  //instantiate a new array
  var optionsArray = [];
for (var i=0;i< c['available']['Community']['attributes']['type']['values'].length; i++){
    optionsArray[i] = {};              // creates a new object
    optionsArray[i].label = c['available']['Community']['attributes']['type']['values'][i];
    optionsArray[i].value = c['available']['Community']['attributes']['type']['values'][i];
    }
    return optionsArray;
})[0];

Result:

[{label:"well-known", value:"well-known"},
{label:"simple", value:"simple"},
{label:"complex", value:"complex"}]

Is my approach efficient enough or is there a way to optimize the above query to get the same desired result?

+4
source share
3 answers

, , . , $unwind, , .. .

$group , , $project .

, :

templateAttributes.aggregate([
    { "$match": { "platform": "V1" } },
    { "$unwind": "$available.Community.attributes.type.values" },
    {
        "$group": {
            "_id": "$available.Community.attributes.type.values",
            "value": { "$first": "$available.Community.attributes.type.values" }
        }
    },
    {
        "$project": {
            "_id": 0,
            "label": "$_id",
            "value": 1
        }
    }
])

Meteor, meteor add meteorhacks:aggregate Meteor, .

+3

, .

db.templateAttributes.aggregate([
                                    {"$match":{platform:"A1"}}, {"$unwind": "$available.Community.attributes.type.values"}, 
                                    {$group: {"_id": null, "val":{"$push":{label:"$available.Community.attributes.type.values", 
                                                                            value:"$available.Community.attributes.type.values"}}}}
                                ]).toArray()[0].val

:

[
    {
            "label" : "well-known",
            "value" : "well-known"
    },
    {
            "label" : "simple",
            "value" : "simple"
    },
    {
            "label" : "complex",
            "value" : "complex"
    }
]
+3

  templateAttributes.aggregate([{
$match: {
    "platform" : "A1"
    }},
    {
    $unwind: {path : "$available.Community.attributes.type.values"}},{   $group:{
    _id:"$_id",
    result:{
        $push: {
            label: "$available.Community.attributes.type.values", value: "$available.Community.attributes.type.values"
            }
        }
    }}])

.

0

Source: https://habr.com/ru/post/1655569/


All Articles