我有一个带有可怕数据结构的JSON文件
{ "@timestamp" : "20160226T065604,39Z",
"@toplevelentries" : "941",
"viewentry" : [ { "@noteid" : "161E",
"@position" : "1",
"@siblings" : "941",
"entrydata" : [
和entrydata是一个包含941个条目的列表,每个条目都是这样的
{ "@columnnumber" : "0",
"@name" : "$Created",
"datetime" : { "0" : "20081027T114133,55+01" }
},
{ "@columnnumber" : "1",
"@name" : "WriteLog",
"textlist" : { "text" : [ { "0" : "2008.OCT.28 12:54:39 CET # EMI" },
{ "0" : "2008.OCT.28 12:56:13 CET # EMI" },
还有更多列。结构永远是这样的:
{
"@columnnumber": "17",
"@name": "PublicDocument",
"text": {
"0": "TMI-1-2005.pdf"
}
}
有一个我们可以丢弃的列号,一个@name是重要部分,然后是text,datetime或textlist字段之一,其中值总是这个奇怪的子文档,带有0键和实际值。
所有941条目具有相同数量的这些列条目,并且列条目始终具有相同的结构。 IE浏览器。如果"@columnnumber": "13"
有一个@name: foo
,那么它总是foo,如果它有一个datetime
密钥,那么它总是会有一个日期时间键,而不是文本或文本列表。这个怪物是在管道的最远端某处的SQL或类似数据库中生成的,但除此之外我无法访问源代码。我们的目标是恢复转换,并将其转换为SELECT
语句将产生的内容(除了textlist,尽管我猜array_agg
和类似的也可以产生)。
有没有办法从MongoDB中获取941个单独的JSON条目,如下所示:
{
$Created: "20081027T114133,55+01",
WriteLog: ["2008.OCT.28 12:54:39 CET # EMI", "2008.OCT.28 12:56:13 CET # EMI"],
PublicDocument: "TMI-1-2005.pdf"
}
答案 0 :(得分:0)
是viewentry也是一个列表吗?
如果你对集合进行聚合,并且在viewentry.entrydata上展开$,你将获得每个entrydata的一个文档。应该可以执行$ project来重新格式化这些文档以生成所需的输出
答案 1 :(得分:0)
这是一个很好的挑战,
像这样出局:
{
"_id" : "161E",
"field" : [
{
"name" : "$Created",
"datetime" : {
"0" : "20081027T114133,55+01"
}
},
{
"name" : "WriteLog",
"textlist" : {
"text" : [
{
"0" : "2008.OCT.28 12:54:39 CET# EMI"
},
{
"0" : "2008.OCT.28 12:56:13 CET# EMI"
}
] } } ]}
使用此聚合管道:
db.chx.aggregate([ {$unwind: "$viewentry"}
, {$unwind: "$viewentry.entrydata"}
,{$group:{
"_id":"$viewentry.@noteid", field:{ $push:{
"name": "$viewentry.entrydata.@name" ,
datetime:"$viewentry.entrydata.datetime",
textlist:"$viewentry.entrydata.textlist" }}
}}
]).pretty()
下一步应该是提取日志条目,但我不知道,因为我的大脑今晚已经被炸了 - 所以我可能稍后再回来......