2011-10-13 2 views
4

점진적으로 집계하려는 데이터에 문제가 있습니다.MongoDB Map/적응 형 쿼리로 단계적으로 줄입니다.

나는 장치기록 컬렉션의 DB에 저장되어있는 조치를 방출 (장치 모음에 저장된 많은,) (NOT 정기적으로)이있다. 각 레코드에는 데이터가 저장된 시간 소인이 아니지만 측정 된 곳의 시간 소인 인 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}}, 

scale1 데이터 통합 ​​(매 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 }}); 

문제처럼 sthg 않는 싶습니다 timeMin 각 장치에 대해 서로 다른 것을, 그것은 출력 콜렉션에 삽입 (time_utc으로 분류) 마지막 항목에 해당한다.

많은 기술을 성공적으로 사용하지 못했습니다 (insertion_time ... 사용).
어떻게 처리 할 수 ​​있습니까?
너무 낮을 것이므로 장치마다 mapreduce를 수행하지 않으려합니다.

답변

0

마지막으로 삽입 된 타임 스탬프가있는 새 필드를 추가했습니다.

각 map reduce call에 대해 감소 된 콜렉션에서 마지막으로 처리 된 타임 스탬프를 얻습니다. 중복 된 처리를 피하기 위해 삽입 된 타임 스탬프에 기반한 쿼리로 map reduce를 호출합니다.

누구든지 더 좋은 아이디어가 있다면, 나는 interrested ;-)

관련 문제