MongoDB - JSON解析

问题描述:

我在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脚本中的所有保留字!

任何建议,将不胜感激。

作为使用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"}} 
    }} 
])