2016-03-03 186 views
0

我有一个可怕的数据结构MongoDB聚合查询拆分和转换JSON?

{ "@timestamp" : "20160226T065604,39Z", 
    "@toplevelentries" : "941", 
    "viewentry" : [ { "@noteid" : "161E", 
     "@position" : "1", 
     "@siblings" : "941", 
     "entrydata" : [ 

和entrydata一个JSON文件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这是重要的组成部分,那么文字,datetime或文本清单的领域之一,其中的值总是这种怪异的子文档与一个0键和实际值。

所有941个条目具有相同数量的这些列条目,并且列条目始终是相同的结构。 IE浏览器。如果"@columnnumber": "13"有一个@name: foo那么它将永远是富,如果它有一个datetime键,那么它总是会有一个日期时间键,从来没有一个文本或文本列表。这个怪物是在流水线最远端的SQL或类似数据库中出现的,但除此之外,我无法访问源代码。我们的目标是恢复转换并将其转化为SELECT声明会产生的内容(除了文本列表,尽管我猜array_agg以及类似的文件也可以生成)。

有没有办法让941个独立JSON条目出的MongoDB看起来像:

{ 
    $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

这里的文档结构不太清楚。你总是在处理'@'和'1'的@ columnnumber值吗?此外,聚合框架(以及如此恕我直言)不以任何方式将数据点转换为“密钥”。如果这些在你的输出中不是固定值(总是只有'$ Created'和'WriteLog',那么mapReduce可能是更好的选择。但是,如果你正在“聚合”任何东西,或者只是寻找内容,可以更清晰,也可以方便地知道数组数据是否固定在索引点总是或不是 –

+0

对不起,还有更多的列,直接转换,是的,“数组数据总是固定在索引点上。不要理解你的意思 – chx

+0

顺便说一句,请不要在近距离投票中发飙(这是我的权利),它只是我使用的机制(因为它应该被使用)来帮助防止提交非答案已经完成了)需要澄清的问题,如果问题已经清楚地回答,我总是会提出投票。 –

回答

0

是VIEWENTRY也是一个列表?

如果您对集合进行了聚合,并且对viewentry.entrydata执行了$ unwind,那么您将为每个entrydata获取一个文档。它应该是可以将做$项目重新格式化这些文件来生产您需要

0

这是一个很好的挑战输出,

得到outupt这样的:

{ 
    "_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":"[email protected]", field:{ $push:{ 
      "name": "[email protected]" , 
      datetime:"$viewentry.entrydata.datetime", 
      textlist:"$viewentry.entrydata.textlist" }} 
      }} 

    ]).pretty() 

下一步应提取日志条目,但我不知道,因为我的大脑已经炒今晚 - 所以也许我可以在以后返回...

+0

是的,那不会将名称移动到属性名称中......但这是一个开始。 – chx

+0

所以有几个问题:1.这可以做到不止一次? 2.这会经常执行吗?,3.这是更大的ETL过程的一部分吗?所以来这个聊天,我们可以尝试解决这个问题http://chat.stackoverflow.com/rooms/104903/mongo-queries-issues – profesor79