2014-07-24 82 views
0

我有兩個MongoDB集合:第一個是下面,其包括用於不同的ID的頻率信息,並且顯示(截短形式)的集合:MongoDB - 如何使用MapReduce將一個集合中的值合併到第二個集合的多個鍵上的另一個集合中?

[ 
    { 
     "_id" : "A1", 
     "value" : 19 
    }, 
    { 
     "_id" : "A2", 
     "value" : 6 
    }, 
    { 
     "_id" : "A3", 
     "value" : 12 
    }, 
    { 
     "_id" : "A4", 
     "value" : 8 
    }, 
    { 
     "_id" : "A5", 
     "value" : 4 
    }, 
    ... 
] 

第二集合是更復雜的,幷包含在列出的每個_id信息第一個集合(這就是所謂frequency_collection_id第二集合中),但frequency_collection_id可能是兩個列表裏(info.details_one,並info.details_two)爲每個記錄:

[ 
    { 
     "_id" : ObjectId("53cfc1d086763c43723abb07"), 
     "info" : { 
      "status" : "pass", 
      "details_one" : [ 
       { 
        "frequency_collection_id" : "A1", 
        "name" : "A1_object_name", 
        "class" : "known" 
       }, 
       { 
        "frequency_collection_id" : "A2", 
        "name" : "A2_object_name", 
        "class" : "unknown" 
       } 
      ], 
      "details_two" : [ 
       { 
        "frequency_collection_id" : "A1", 
        "name" : "A1_object_name", 
        "class" : "known" 
       }, 
       { 
        "frequency_collection_id" : "A2", 
        "name" : "A2_object_name", 
        "class" : "unknown" 
       } 
      ], 
     } 
    } 
    ... 
] 

什T I正在尋找做,是合併的頻率信息(從第一個集合)進入第二收集,封筆的集合,它看起來像:

[ 
    { 
     "_id" : ObjectId("53cfc1d086763c43723abb07"), 
     "info" : { 
      "status" : "pass", 
      "details_one" : [ 
       { 
        "frequency_collection_id" : "A1", 
        "name" : "A1_object_name", 
        "class" : "known", 
        **"value" : 19** 
       }, 
       { 
        "frequency_collection_id" : "A2", 
        "name" : "A2_object_name", 
        "class" : "unknown", 
        **"value" : 6** 
       } 
      ], 
      "details_two" : [ 
       { 
        "frequency_collection_id" : "A1", 
        "name" : "A1_object_name", 
        "class" : "known", 
        **"value" : 19** 
       }, 
       { 
        "frequency_collection_id" : "A2", 
        "name" : "A2_object_name", 
        "class" : "unknown", 
        **"value" : 6** 
       } 
      ], 
     } 
    } 
    ... 
] 

我知道,這應該是可能的MongoDB的MapReduce函數,但是我看到的所有例子對於我的集合結構來說都太小,或者回答的問題不是我想要的。

有沒有人有任何指針? 如何將我的頻率信息(從我的第一個集合中)合併到記錄中(在第二個集合的每個記錄的兩個列表中)?

我知道這是多還是少一個JOIN,這MongoDB不支持,但是從我的閱讀,看起來這是MapReduce一個最好的例子。

我正在學習Mongo,因爲我可以,所以請原諒我,如果我的問題太天真了。

回答

1

就像所有的MongoDB操作一樣,MapReduce總是隻運行在一個集合上,不能從另一個集合獲取信息。所以你第一步需要將兩個集合轉儲爲一個。你的文件有不同的_id,所以它們不應該成爲他們共存於同一個集合中的問題。

然後你做一個MapReduce的其中地圖功能emit S代表他們的共同key,這是他們的射頻識別這兩種文件。

您的減少函數將接收每個鍵的兩個文檔的數組:您收到的兩個文檔。然後您只需將這兩個文檔合併爲一個。請記住,reduce函數可以按任意順序接收這兩個文檔。它也可能發生它被調用的部分結果(僅兩個文檔中的一個)或已完成的結果。你需要優雅地處理這些案例!一個好的實現可能是創建一個新對象,然後迭代輸入文檔,將所有現有的相關字段和它們的值複製到新對象中,因此生成的對象是輸入文檔的合併。

相關問題