MongoDB聚合查询分割和转换JSON?

时间:2016-03-03 20:23:56

标签: mongodb aggregation-framework

我有一个带有可怕数据结构的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"
}

2 个答案:

答案 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() 

下一步应该是提取日志条目,但我不知道,因为我的大脑今晚已经被炸了 - 所以我可能稍后再回来......