Mongodb многомерная агрегация / дедупликация данных - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть коллекция, содержащая данные, аналогичные этим:

{
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 (), похоже, предназначен для таких вещей, но не может обрабатывать мой размер данных

1 Ответ

2 голосов
/ 20 февраля 2012

Я думаю, вы хотите 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

Если вы хотите вставить все отдельные значения, а затем объединить их позже, я бы посоветовал вам объединить их в отдельную коллекцию (чтобы избежать путаницы). Вероятно, самый простой способ сделать это - использовать карту / уменьшение, а не группу, поскольку вы можете просто установить параметры вывода карты / уменьшения, чтобы объединить ее выходные данные в совокупную коллекцию с такими параметрами: out : {reduce: "aggregatedcollection"}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...