4

我有一个包含字符串数组的mongo文档,我需要将此特定数组字符串转换为包含键值对的数组。以下是我对它的一些看法。将mongo数组转换为具有键值对的对象

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


} 

当前查询:

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]; 

结果:

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

是我的做法效率不够高,或者是有没有办法来优化上面的查询得到同样的期望的结果?

+0

需要在MongoDB上做什么具体的原因? –

+0

不。没有具体原因需要在mongo方面完成。由于我在流星中使用这个查询,所以这个查询在内存中运行(mini-mongo)。 – blueren

+0

@bluereen好的。然后聚合是解决方案。请记住'$ unwind'会乘以结果集大小array.length times。因此,以前使用'$ project'只需保留必需的字段,也许只有'值'。 –

回答

3

不是很确定你想要的最终结果做作为键和值是一样的东西。尽管如此,您可以使用汇总框架 ,您可以在其中通过使用运算符来对内嵌值数组进行非规范化操作,该操作符将其变平,即它会为每个数组条目生成每个文档的副本。

平整值数组后,您可以将积累运算符应用于这些值以对它们进行聚合。运算符的最后一个流水线会将来自先前分组的字段整形为期望的格式。

按照这个例子中得到的概念:

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 
     } 
    } 
]) 

由于您使用的流星,流星添加meteorhacks:aggregate将增加对流星适当聚集的支持,使您可以在运行上述聚合管道你的收藏。

+0

我打算将它们传递给HTML 菜单。谢谢! – blueren

+1

谢谢克里斯。我仍然在讨论包和整个aggegate查询,因​​为包只能在服务器端执行。除此之外,我使用自动模式并从客户端的mongo查询提供下拉数据 – blueren

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" 
    } 
] 
+1

谢谢。我会给这个镜头并得到回复。 – blueren

0

使用查询

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" 
      } 
     } 
    }}]) 

它会给你确切的预期的答案。