我在MongoDB中有一个有效的JSON结构,需要在运行时进行更改。以下是一个集合中3个这样的独立文档的有效快照:
{
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,就像我生成它或打印出来时一样,它不会打印到屏幕上。
最后一行打印(Outext)显示了一些奇怪的消息,询问我是否希望显示181个首选项,如果我说是-它列出了java脚本中的所有保留单词!
如有任何建议,将不胜感激。
发布于 2016-01-22 04:54:05
作为使用MapReduce或Javascript的替代方法,您可能需要考虑使用聚合框架。
您想要的输出可以使用以下方法在Mongo shell中生成:
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"}}
}}
])https://stackoverflow.com/questions/34923904
复制相似问题