2011-11-20 112 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