2013-07-11 45 views
0

我要對其執行兩套不同的具有一個共同的場文件連接操作路口。我有以下設置。加入/ MapReduce的使用MongoDB中

收集一個

{ 
    "common_key" : "v1" , 
    "a2" : "v2", 
    "a3" : "v3", 
    ..... 
} 

集合體B

{ 
    "common_key" : "v1" , 
    "b2" : "z2", 
    "b3" : "z3", 
    ..... 
} 

由於MapReduce的只能在一個集工作,我合併A的內容和B到收藏Combo。此外,我增加了一個現場_dataType表明它是否是A型或B的

收集組合= A + B

{ 
    "common_key" : "v1" , 
    "b2" : "z2", 
    "b3" : "z3", 
    "_dataType" : "B", 
    ..... 
} 

{ 
    "common_key" : "v1" , 
    "a2" : "v2", 
    "a3" : "v3", 
    "_dataType" : "A", 
    ..... 
} 

我想寫一個MapReduce的功能,使得對所有這些文件已經爲每個數據相同common_key A型&乙它應該輸出

{ 
    "common_key" : v1 , 
    "A" : [ 
      { 
       "a2" : "v2", 
       "a3" : "v3", 
       ... 
      }, 
      ... 
      ], 
    "B" : [ 
      { 
       "b2" : "z2", 
       "b3" : "z3", 
       ..... 
      }, 
      .. 
      ] 
} 

任何指針或幫助是非常讚賞

回答

0

快速回答使用聚合框架

db.coll.aggregate({ 
    "$group": { 
     "_id": "$common_key", 
     "A": { 
      "$push": { 
       "$cond": [ 
        { 
         "$eq": [ 
          "$_dataType", 
          "A" 
         ] 
        }, 
        { 
         "a2": "$a2", 
         "a3": "$a3" 
         // you have to put all A dataType field here 
        }, 
        {} 
       ] 
      } 
     }, 
     "B": { 
      "$push": { 
       "$cond": [ 
        { 
         "$eq": [ 
          "$_dataType", 
          "B" 
         ] 
        }, 
        { 
         "b2": "$b2", 
         "b3": "$b3" 
         // you have to put all B dataType field here 
        }, 
        {} 
       ] 
      } 
     } 
    } 
}) 

缺點:你必須寫的所有領域和B的數據類型項目他們,你就必須和每個陣列空對象(A和B)