2016-01-21 111 views
2

我在MongoDB中有一個有效的JSON結構,需要在運行時進行更改。這裏是3個這樣的單獨的文件中的單個集合的有效快照: -MongoDB - JSON解析

{ 
    company : "ABC", 
    tags : ["ADMIN", "QA"], 
    year : 2010, 
    Project : [{ 
      Domain : "Telecom", 
      tags : ["DEV", "ADMIN"], 
      size : 15 
     }, { 
      Domain : "Retail", 
      tags : ["ADMIN", "DEV"], 
      size : 35 
     }, { 
      Domain : "Finance", 
      tags : ["ADMIN"], 
      size : 25 
     } 
    ] 
} 
{ 
    company : "ABC", 
    tags : ["QA"], 
    year : 2011, 
    Project : [{ 
      Domain : "Telecom", 
      tags : ["DEV"], 
      size : 15 
     }, { 
      Domain : "Retail", 
      tags : ["ADMIN", "DEV"], 
      size : 35 
     }, { 
      Domain : "Finance", 
      tags : ["ADMIN"], 
      size : 25 
     } 
    ] 
} 
{ 
    company : "ABC", 
    tags : ["QA"], 
    year : 2012, 
    Project : [{ 
      Domain : "Telecom", 
      tags : ["DEV", "ADMIN"], 
      size : 15 
     }, { 
      Domain : "Retail", 
      tags : ["ADMIN", "DEV"], 
      size : 35 
     }, { 
      Domain : "Finance", 
      tags : ["ADMIN"], 
      size : 25 
     } 
    ] 
} 

的結構需要這些3個文件合併成1,然後以下列方式顯示: -

{ 
    "company" : "ABC", 
    "tags" : ["ADMIN", "QA"], 
    "period" : { 
     [{ 
       year : 2010, 
       Project : [{ 
         Domain : "Telecom", 
         tags : ["DEV", "ADMIN"], 
         size : 15 
        }, { 
         Domain : "Retail", 
         tags : ["ADMIN", "DEV"], 
         size : 35 
        }, { 
         Domain : "Finance", 
         tags : ["ADMIN"], 
         size : 25 
        } 
       ] 
      } 
     ], 
     [{ 
       year : 2011, 
       Project : [{ 
         Domain : "Telecom", 
         tags : ["DEV"], 
         size : 15 
        }, { 
         Domain : "Retail", 
         tags : ["ADMIN", "DEV"], 
         size : 35 
        }, { 
         Domain : "Finance", 
         tags : ["ADMIN"], 
         size : 25 
        } 
       ] 
      } 
     ], 
     [{ 
       year : 2012, 
       Project : [{ 
         Domain : "Telecom", 
         tags : ["DEV", "ADMIN"], 
         size : 15 
        }, { 
         Domain : "Retail", 
         tags : ["ADMIN", "DEV"], 
         size : 35 
        }, { 
         Domain : "Finance", 
         tags : ["ADMIN"], 
         size : 25 
        } 
       ] 
      } 
     ] 
    } 
} 

我知道我可以使用地圖縮減並完成此操作。但我認爲我應該嘗試爲此編寫一個Java腳本函數,然後在需要完成時調用它。

假設可以使用集合調用以下函數,一個記錄集將被傳遞給下面的函數。

`var curlprojects = function() 
{ 
    var arrSyn = new Array(); 
    var JSONString = ""; 
    var doc; 
    var parent; 
    var arrTop = new Array(); 
    while (myCursor.hasNext()) 
    { 
     doc = myCursor.next(); 
     parent = doc.companyName; 
     var fulltext = "{\"year\":" + tojson(doc.year) + ",\"project\":" + tojson(doc.project) + "}"; 
     JSONString = JSONString + fulltext; 
    }; 
    arrSyn.push(JSONString); 
    var outext = "{\"period\":" + JSONString + "}"; 
    print(outext); 
} ` 

這是問題所在。儘管文本看起來像JSON,比如當我生成它或打印出來時,它不會打印到屏幕上。

最後一行print(outext)顯示一些奇怪的消息,詢問我是否希望顯示181個偏好設置,如果我說是 - 它會列出java腳本中的所有保留字!

任何建議,將不勝感激。

回答

2

作爲使用MapReduce或Javascript的替代方法,您可能需要考慮使用aggregation framework

你想輸出可以在蒙戈生成外殼採用:

db.test.aggregate([ 

    //optional: match a single company 
    {$match:{"company":"ABC"}}, 

    //expand the "tags" array 
    {$unwind:"$tags"}, 

    //"group by" stage: 
    {$group: { 

    //group by company 
    _id:"$company", 

    //add unique tags into the "tags" array 
    tags: {$addToSet:"$tags"}, 

    //add the "Project" details into the "period" array 
    period: {$push: {year:"$year", Project:"$Project"}} 
    }} 
])