2012-02-20 15 views
0

我有一个包含数据类同此集合:MongoDB的多维数据聚集/去重复

{ 
dimension1:a, 
dimension2:b, 
dimension3:c, 
dimension4:d, 
dimension5:e, 
value: x 
} 

则存在a,b,c,d,e可以具有的值的有限数。因此,可以看到两行具有相同的尺寸和不同的存储的值,这样的:

{ dimension1:1, dimension2:1, dimension3:1, dimension4:1, dimension5:1, value: 12 } 
{ dimension1:1, dimension2:1, dimension3:1, dimension4:1, dimension5:1, value: 34 } 

我想聚集具有匹配的尺寸的物体,并与一个对象与值的和替换它们。

我知道我可以用mapReduce做到这一点,但有没有办法做到这一点更简单/更快,甚至可以确保我的插入语句会添加到现有的值,如果有的话?

[编辑]

我也看到db.collection.group()似乎专门做这样的事情,但它不能处理我的数据

回答

2

的大小我想你想的Upsert With Modifier 。这样可以满足你的第二种方法,这样如果没有匹配的行存在就插入一行,或者如果匹配的行存在,只需添加该值。如果要插入,那么所有的单个值后聚集他们,我会建议您汇总他们一个单独的集合(以避免混淆)

db.mycollection.update({ dimension1: a, ... dimension5: e }, { $inc: { value: x } }, true); //the 'true' is the param that makes this update an upsert 

所以,你的例子是有点像。可能最简单的方法是使用map/reduce而不是group,因为您可以简单地设置map/reduce的输出选项,将其输出合并到汇总集合中,并使用如下选项:out : {reduce: "aggregatedcollection"}

+0

我已经知道合并mapReduce输出,但upsert对我来说是一个新的重大发现。非常感谢! – naugtur 2012-02-20 13:27:59

+0

没问题,很高兴帮助! – Russell 2012-02-20 13:29:40

+0

供将来参考:大集合上的upsert几乎和select + update一样慢 – naugtur 2012-11-05 13:27:56