2017-11-30 24 views
0

Cloudant의 map reduce 기능을 사용하고 있으며 특정 사용자의 이름 (사용자 입력)에 얼마나 많은 이벤트 (이벤트 개체 수)가 있는지 찾아야합니다. 기간 (사용자로부터 입력) 동안mapreduce를 사용하여 Cloudant의 특정 사용자에 대해 발생한 이벤트 수를 계산합니다.

다음과 같은 문서가 있습니다.

{ 
user: { 
    name: 'peter pan' 
}, 
startEventDateTime: <timestamp>, 
endDateDateTime: <timestamp>, 
events: [ 
    { 
    name: 'La la land', 
    text: 'more info' 
    }, 
    { 
    name: 'La la land', 
    text: 'more info' 
    } 
] 
} 

위 수단, 사용자는 그 시작과 끝 시간 사이 사이에이 이벤트에 참석했다. 이벤트 참석 목록에는 다른 날짜 범위에 대해 동일한 사용자에 대한 많은 문서가 있습니다.

Cloudant지도에서 어떻게 줄일 수 있습니까?

내 시도 : 지도를 올바르게 가져올 수 없습니다. 나는 지도를 수행하여 이름으로 필터링 할 수 있습니다

function (doc) { 
    emit([doc.user, doc.events, startEventDateTime, endDateDateTime], doc) 
} 

감소 :

function (keys, values, rereduce) { 
    if (rereduce) { 
    return sum(values); 
    } else { 
    return values.length; 
    } 
} 
+0

지금까지 해보신 것은 무엇입니까? – Stephen

답변

1

나는 당신의 문서를 다른 형식을 고려 건의 할 것입니다. 날짜 범위를 선택하는 그런 다음 맵리 듀스에 의존 할 수

{ 
    "_id": "c48ee0881ce7c5d39243d2243d2e63cb", 
    "_rev": "1-c2f71fba5f09b129f1db20785f2429b2", 
    "user": "bob", 
    "datetime": "Thu 30 Nov 2017 09:46:02 GMT", 
    "event": { 
    "name": "lalaland", 
    "text": "more info" 
    } 
} 

대신 이벤트의 목록을 가진 사용자의 문서를 필요없이, 등이 발생되는 시간 소인이 각 이벤트에 대해 별도의 문서를 만들 사용자 당. 여기에 단지를 수행하는 map 함수는 다음과 같습니다

function (doc) { 
    if (doc && doc.user && doc.datetime) { 
    var when = new Date(Date.parse(doc.datetime)); 
    emit([doc.user, when.getFullYear(), when.getMonth(), when.getDay()], 1); 
    } 
} 

와 내장이 _sum을 줄이고 사용. 이제 키 범위를 사용하여 데이터를 슬라이스 할 수 있습니다. 2017 년 8 월, 사용자가 참석 한 이벤트 bob :

curl 'https://ACCT.cloudant.com/DBNAME/_design/DDOC/_view/VIEWNAME?startkey=\["bob", 2017, 7\]&endkey=\["bob", 2017, 8]&group=true&inclusive_end=false&reduce=true' 

{ 
    "rows": [ 
    { 
     "key": [ 
     "bob", 
     2017, 
     7, 
     4 
     ], 
     "value": 1 
    } 
    ] 
}