2014-01-16 4 views
-1

Я довольно новый для больших объемов данных, и мы имеем миллионы записей, которые имеют данные следующим образом -MongoDB запрос или программное решение

ID Timestamp Status 
1.  12:00:00.  ON 
1.  12:00:35.  Off 
1.  12:01:01.  ON 
1.  12:10:00.  Off 
1.  12:11:00.  On 

мне нужно рассчитать общее время он был выключен. Это по миллионам записей, поэтому решение должно быть быстрым. Любые мысли о том, что я мог бы сделать либо алгоритмически, либо через запросы? Я считаю, что один из способов - перебрать данные через массив, но это кажется слишком трудоемким, и я уверен, что люди это делали раньше.

+3

Что такое формат данных? Вы говорите, итерации через массив - что такое массив? Можете ли вы включить фактический документ, находящийся в БД? Также гарантированы ли события, которые будут упорядочены и уникальны? То есть у вас не может быть ВЫКЛ после другого ВЫКЛ или вы можете? –

+0

1. Формат данных - это json, поскольку он хранится в mongodb. – user3204574

+0

1. Когда я имел в виду массив, то, что я пытался сказать, я могу написать запрос, который возвращает и вставляет эти данные в массив с помощью java. Мне придется настроить тестовый документ, и я могу сделать это дома. Я только поместил соответствующий документ, но могу гарантировать, что они уникальны. И да, у вас может быть еще один за другим, так как обновлен какой-то другой столбец. – user3204574

ответ

0

Вы можете сделать две совокупности, которые получают сумму временных меток для ВЫКЛ и одну, которая получает сумму временных меток для ВКЛ (нормализует все до секунд с определенной фиксированной даты, выбирает что-то недавнее, чтобы избежать переполнения, если это возможно, хотя расчеты будут с двойным типом, поэтому у вас есть передышка). Затем вычтите сумму временных меток ON из временных меток OFF. Пока они все спарены правильно (у вас есть один ВЫКЛ для каждого ВКЛ), это будет правильный ответ.

Это потому, что вы можете переписать на сумму

enter image description here

где «B являются OFF события и» A находятся на события.

Чтобы сделать это с рамками агрегации, что-то, как это может работать, чтобы сделать сложений, предполагая, что документы имеют форму {_id: <id>, timestamp: <ts>, status: <'ON'|'OFF'>}:

db.coll.aggregate({$group: {_id: '$status', total: {$sum: '$timestamp'}}}) 
+0

это не работает концептуально, когда состояния «on» и «off» не спарены - «off» может следовать «выключен», кажется (согласно пояснительному комментарию). Кроме того, сумма допускается только для чисел, поэтому, если временная метка хранится как что-либо, кроме номера, ваше «общее» будет равно 0. –

Смежные вопросы