2010-05-12 3 views
20

MongoDB 문서의 예제보다 약간 더 복잡한 것이 필요하며 머리를 감쌀 수없는 것처럼 보입니다. MongoDB의 map/reduce를 사용하여 두 개의 필드를 그룹으로 묶습니다.

내가 날짜와 유형 모두에 걸쳐 그룹화,

{date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...} 지금 내가 쿼리하여 SQL 그룹에 비슷한 싶어 형태의 개체의 컬렉션을 말해봐. 즉, 매일 각 유형의 이벤트 수가 필요합니다. 또한 user_id로 고유하게 만들고 싶습니다. 같은 날에 더 많은 이벤트가있는 경우 한 번만 계산하십시오.

map/reduce를 사용하여이 작업을 수행하려고합니다.

내가 할

db.logs.mapReduce( 
    function() { 
     emit(this.type, 1); 
    }, 
    function(k, vals) { 
     var total = 0; 
     for (var i = 0; i < vals.length; i++) 
      total += vals[i]; 
     return total; 
    } 
) 

유형별로 잘 그룹,하지만 지금은, 내가 어떻게 같은 시간에 날짜별로 그룹? emit()의 키가 배열이 될 수 없다고 생각합니다 (나는 emit([this.date, this.type], 1)에 대해 생각했습니다). 또한 사용자 별 고유성을 어떻게 보장 할 수 있습니까?

저는 MongoDB로 시작 했으므로 여전히 기본 개념을 파악하는 데 어려움을 겪고 있습니다. 또한, 거기 밖으로 사용할 수있는 많은 설명서가 없습니다. 경험이 많은 사용자의 도움을 주시면 감사하겠습니다. 감사!

+0

couchdb는 배열을 키로 사용할 수 있습니다. 단지 ' – dominic

답변

19

MongoDB Cookbook에서 아주 좋은 해결책을 찾았습니다 (전에이 자원에 대해 몰랐습니다).

http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

는 기본적으로 여러 키에 의해 그룹에, 당신은 DICT,하지 (I 시도로) 목록을 사용합니다. 또한 독특한 결과를 얻으려면 두 번의지도/축소 패스를 만들어야합니다.

+3

링크가 작동하지 않습니다. 그룹화/소수 필드에 대한 방출에 관심이있는 사람은 다음 구조를 사용할 수 있습니다. emit ({date : this.date, type : this.type}, 1) –

관련 문제