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