我有一个包含类似数据的集合:
{
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()似乎是为了做这样的事情,但它无法处理我的数据大小
答案 0 :(得分: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"}
。