2016-03-03 71 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