我有一个包含类似以下内容的数据的集合:
{
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来做这件事,但是有没有一种方法可以更简单/更快,或者甚至保证我的insert语句会添加到现有的值中呢?
编辑
我还看到db.collection.group()似乎被设计用来做这样的事情,但是它不能处理我的数据大小
发布于 2012-02-20 20:29:08
我想你想要一个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如果您希望插入所有的单个值,然后将它们聚合在一起,我建议您将它们聚合到一个单独的集合中(以避免混淆)。最简单的方法可能是使用一个映射/reduce而不是一个组,因为您可以简单地设置map/reduce的输出选项,以便使用如下选项将其输出合并到聚合集合中:out : {reduce: "aggregatedcollection"}。
https://stackoverflow.com/questions/9361018
复制相似问题