2015-09-29 37 views
0

我有一個存儲在mongodb中的記錄數據集,我一直在試圖從記錄中提取一組複雜的數據。彙總輸出到Nest Arrays

記錄樣本如下: -

{ 
    bookId : '135wfkjdbv', 
    type : 'a', 
    store : 'crossword', 
    shelf : 'A1' 
} 
{ 
    bookId : '13erjfn', 
    type : 'b', 
    store : 'crossword', 
    shelf : 'A2' 
} 

我一直在試圖提取數據,使得對於每個BOOKID,我得到一個數(記錄),用於保存標識的圖書每家店的名字每個貨架通過bookId這本書的類型是'a'。

據我所知,聚合查詢允許一個管道,允許分組,匹配等,但我一直無法達成解決方案。

所需的輸出的形式爲: - 當你看到在

{ 
    bookId : '135wfkjdbv', 
    stores : [ 
     { 
      name : 'crossword' 
      shelves : [ 
       { 
        name : 'A1', 
        count : 12 
       }, 
      ] 
     }, 
     { 
      name : 'granth' 
      shelves : [ 
       { 
        name : 'C2', 
        count : 12 
       }, 
       { 
        name : 'C4', 
        count : 12 
       }, 
      ] 
     } 
    ] 
} 

回答

0

的過程是不是真的那麼難。聚合「管道」就是這樣的情況,每個「階段」將結果提供給下一個進行處理。就像UNIX的「管」:

ps -ef | grep mongo | tee out.txt 

所以它只是增加階段,而實際上3個$group階段,其中第一確實基本聚集和其餘兩個簡單的「捲起」,在輸出所需的陣列。

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "bookId": "$bookId", 
      "store": "$store", 
      "shelf": "$shelf" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": { 
      "bookId": "$_id.bookId", 
      "store": "$_id.store" 
     }, 
     "shelves": { 
      "$push": { 
       "name": "$_id.shelf", 
       "count": "$count" 
      } 
     } 
    }}, 
    { "$group": { 
     "_id": "$_id.bookId", 
     "stores": { 
      "$push": { 
       "name": "$_id.store", 
       "shelves": "$shelves" 
      } 
     } 
    }} 
]) 

你可以在年底可能$project改變_idbookId,但你應該已經知道這是它是什麼,習慣了治療_id作爲主鍵。這樣的操作是有成本的,所以這是一種你不應該習慣的習慣,並從一開始就學會正確地做事。

所以真正發生在這裏的是所有組成的分組細節的主要關鍵字爲$group,其他字段的產生爲count,以統計該分組中的貨架。認爲SQL當量:

GROUP BY bookId, store, shelf 

所有彼此階段確實是轉置每個分組電平成陣列條目,首先由BOOKID內的存儲,然後在商店內貨架。每次主分組鍵中的字段都被進入生成數組的內容減少。

當你開始考慮「流水線」處理時,它就變得清晰了。在構建一個表單時,將該輸出轉移到下一個表單,依此類推。這基本上是你如何摺疊兩個數組中的結果。

+0

謝謝你的詳細解答:) – ContinuousError