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

它會給你確切的預期的答案。

相關問題