2011-11-20 110 views
0

我有一個包含大約110萬個文檔的集合。這個集合中有相當多的重複,我最終將通過mapreduce消除這個重複。無論其...MongoDB:合併陣列

這裏是冗餘數據的一個示例:

{ 
    "_id": ObjectId("4ec6d3ac61910ad451f1eb7a"), 
    "bii": 10.8105, 
    "class": 2706, 
    "decdeg": -48.8432, 
    "lii": 286.488, 
    "name": "HD 97312", 
    "radeg": 167.8669, 
    "vmag": 8.2, 
    "xref": ["HD 97312"] 
} 

{ 
    "_id": ObjectId("4ec6d44c61910ad451f8b255"), 
    "bii": 10.802, 
    "class": 2900, 
    "decdeg": -48.8517, 
    "decpm": -0.008, 
    "lii": 286.4896, 
    "name": "PPM 316146", 
    "radeg": 167.8644, 
    "rapm": -0.0003, 
    "vmag": 8.2, 
    "xref": ["CPD -48 3792", "-48 6250", "HD 97312", "PPM 316146", "SAO 222629"] 
} 

{ 
    "_id": ObjectId("4ec6d48c61910ad451ff1ead"), 
    "bii": 10.802, 
    "class": 2700, 
    "decdeg": -48.8517, 
    "decpm": -0.013, 
    "hd_component": 0, 
    "lii": 286.4897, 
    "name": "SAO 222629", 
    "radeg": 167.8647, 
    "rapm": -0.0006, 
    "vmag": 8.3, 
    "xref": ["CP-48 3792", "HD 97312", "SAO 222629"] 
} 

由於外部參照數組保存所有的交叉引用的,我不知何故需要將這些陣列組合成一個單一的一個移除重複。

任何人都可以提出一個「簡單」的方法來做到這一點,所以我不必編寫某種遞歸js函數?

+0

在過程結束時,您是否希望這三個文件中的每一個都包含「[」CPD -48 3792「,」-48 6250「,」HD 97312「,」PPM 316146「,」SAO 222629「]'因爲它們都是交叉引用的?或者你是否想要在所有文檔中構建所有外部參照的列表?請解釋預期的輸出。 –

+0

你是對的。所有這些交叉引用文檔的最終結果數組應該相同。 – Jason

回答

1

我不是100%清楚你在這裏需要什麼。我在這裏看到兩種可能性。

如果你正在做一個Map/Reduce,那麼你只需要確保重複「減少」時。應該像M/R中的幾個for循環一樣簡單。

如果你從頭開始構建這些數據,那麼你應該看看$addToSet更新函數,它會給你你想要的。

+0

我還沒有做地圖/減少。由於Mongo不支持還原成數組(錯誤是「reduce-> multiple not supported」),所以我首先處理數組。但是,我會查看$ addToSet,乍一看看起來很有前景。 – Jason