MongoDB Map / Уменьшить с помощью адаптивного запроса - PullRequest
4 голосов
/ 13 октября 2011

У меня проблема с данными, которые я хочу объединить постепенно.

У меня есть устройства (много, хранящиеся в коллекции устройств), которые испускают меры (НЕ регулярно), которые хранятся в БД в коллекции record . У каждой записи есть timestamp_utc, который является не временной меткой, где данные были сохранены, а местом измерения, где измерены. (совершенно другой, поскольку устройства посылают множество мер)

То, что я хочу - это группировать данные (Map Reduce) с разными масштабами для каждого устройства постепенно. Например, я хочу коллекцию со средним показателем каждые 5 минут, один раз в 30 минут, ... каждый день и т. Д. ... Я не хочу каждый раз обрабатывать целые данные, а только новые записи.

Пример: коллекция записей содержит:

{ _id : {device1, time : ISODate(2011-10-12T13:50:01Z)}, value : { meas1 : 2, meas2 : 4}},
{ _id : {device1, time : ISODate(2011-10-12T13:51:01Z)}, value : { meas1 : 1, meas2 : 6}},
{ _id : {device2, time : ISODate(2011-10-12T13:49:01Z)}, value : { meas1 : 3, meas2 : 7}},
{ _id : {device2, time : ISODate(2011-10-12T13:50:01Z)}, value : { meas1 : 4, meas2 : 8}},
{ _id : {device2, time : ISODate(2011-10-12T13:51:01Z)}, value : { meas1 : 5, meas2 : 9}},

После агрегирования данных по шкале1 (каждые 5 минут) у меня будет что-то вроде

{ _id : {device1, time : ISODate(2011-10-12T13:50:00Z)}, value : { meas1 : 1.5, meas2 : 5}},
{ _id : {device2, time : ISODate(2011-10-12T13:45:00Z)}, value : { meas1 : 3, meas2 : 7}},
{ _id : {device2, time : ISODate(2011-10-12T13:50:00Z)}, value : { meas1 : 4.5, meas2 : 8.5}},

и т. Д. На каждую продажу. Генерация этих данных в первый раз, естественно, не имеет большого значения, и это очень обычная операция преобразования / уменьшения.

db.record.mapReduce(map, reduce, {finalize : finalize, out :  { merge : db.recordscale1 }});

Проблема возникает, когда я хочу сделать пошаговое уменьшение карты. На самом деле я хотел бы сделать что-то вроде этого

db.record.mapReduce(map, reduce, {query : { "_id.time_utc" : { $gte : timeMin } }, finalize : finalize, out :  { merge : db.recordscale1 }});

Проблема в том, что timeMin отличается для каждого устройства, оно должно соответствовать последней записи (отсортированной по time_utc), вставленной в коллекцию вывода.

Я безуспешно перепробовал множество методов (используя inserttion_time ...).
Кто-нибудь знает, как я могу справиться с этим?
Я хочу не делать одно mapreduce на устройство, так как оно будет слишком низким.

1 Ответ

0 голосов
/ 03 мая 2012

Наконец, я добавил новое поле со вставленной временной меткой.

Для каждого вызова сокращения карты я получаю последнюю обработанную временную метку в уменьшенной коллекции, я вызываю карту сокращения с запросом на основе вставленной временной метки, чтобыИзбегайте дублирующих процедур.

Если у кого-то есть идея получше, меня интересует; -)

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