0

나는 다음과 같다 구조를 가지고 MongoDB의에서 로그 수집을 가지고은 "쿼리"필드가 요청 된 URL의 쿼리 매개 변수입니다문자열 조작 및 집계

{ 
    url : "http://example.com", 
    query : "name=blah,;another_param=bleh", 
    count : 5 
} 

. 쿼리 매개 변수 "이름"으로 그룹화 된 합계를 계산하려고합니다. 예를 들어,이 컬렉션 : 나는 집계 프레임 워크를 사용하여이 문자열 조작을 할 수있는 것처럼

[{ 
    key : "blah", 
    count : 7 
}, 
{ 
    key : "another_name", 
    count : 3 
}] 

그것은 보이는 나던 :

[{ 
url : "http://example.com", 
query : "name=blah,;another_param=bleh", 
count : 3 
}, 
{ 
url : "http://example.com", 
query : "name=blah,;another_param=xyz", 
count : 4 
}, 
{ 
url : "http://example.com", 
query : "name=another_name,;another_param=bleh", 
count : 3 
}] 

나는이 출력이 필요합니다. map-reduce를 통해이 작업을 수행 할 수 있지만 map-reduce 작업을 집계 파이프 라인의 일부로 할 수 있습니까?

답변

2

집계 프레임 워크에는 문자열 내용을 해부하고이 작업에 필요한 키/값 쌍으로 구분하는 데 필요한 문자열 조작 연산자가 없습니다. 현재 사용 가능한 유일한 문자열 조작은 $substr입니다. 고정 길이 데이터를 다루지 않는 한 도움이되지 않습니다.

올바른 조작을 수행하는 데 사용할 수있는 자바 스크립트 기능 만 있으므로 현재 서버 측에서는 mapReduce를 사용하는 것이 유일한 방법입니다. 이런 식으로 뭔가 :

매퍼를 들어

function() { 
    var obj = {}; 
    this.query.split(/,;/).forEach(function(item) { 
     var temp = item.split(/=/); 
     obj[temp[0]] = temp[1]; 
    }); 

    if (obj.hasOwnProperty('name') 
     emit(obj.name,this.count); 

} 

그리고 감속기 : "이름"매개 변수 및 사용을 분할하는 데 필요한 자바 스크립트 함수의 기본 구조입니다

function(key,values) { 
    return Array.sum(values); 
} 

그것들을 집계를위한 "키"또는 "키"발생의 일반적인 카운팅으로 사용합니다.

그래서 집계 프레임 워크는 데이터에 대해 원시 코드 연산자를 실행하기 때문에 JavaScript 자체를 실행할 수 없습니다.

문서가 MongoDB에 삽입 될 때 요소가 문자열이 아닌 "개체"표현으로 세분화되도록 데이터 저장 방법을 변경하는 것이 좋습니다. 데이터가 이제 기본적으로 처리 할 수있는 형태로 구성 될 때 이것은 $group 파이프 라인 단계 매우 간단하게

[{ 
"url": "http://example.com", 
"query": { 
    "name": "blah", 
    "another_param": "bleh" 
}, 
"count": 3 
}, 
{ 
"url": "http://example.com", 
"query": { 
    "name": "blah", 
    "another_param": "xyz" 
}, 
"count": 4 
}, 
{ 
"url": "http://example.com", 
"query": { 
    "name": "another_name", 
    "another_param": "bleh" 
}, 
"count": 3 
}] 

:

이 데이터를 조작하기 위해 자바 스크립트 실행에 의존하지 않는 네이티브 쿼리 양식을 할 수 있습니다
{ "$match": { "query.name": { "$exists": true } }, 
{ "$group": { 
    "_id": "$query.name", 
    "count": { "$sum": "$count" } 
}} 

mapReduce를 지금 사용하십시오. 그러나 궁극적으로 쿼리 문자열에서 "토큰"을 분리하여 구조화 된 데이터로 표시하고 선택적으로 원래 문자열을 다른 필드에 유지하도록 데이터 기록을 변경하는 것을 고려하십시오.

aggregation 프레임 워크는 mapReduce보다 훨씬 빠르게 처리하므로 더 좋은 옵션입니다.

+0

자세한 내용은 감사합니다. –

+0

안녕하세요 닐, 매개 변수를 전달하여지도 함수에서 사용되는 문서를 필터링하는 방법이 있는지 알고 계십니까? 예를 들어, "url"이 "http://example.com"인 문서에 대해서만 위의 집계를 수행하고 싶습니다.현재 mapreduce 옵션 만 사용할 수 있습니다. –

+0

@NavinViswanath mapReduce는 표준 쿼리 인수를 취하여 거기에서 필요한 것을 지정할 수 있습니다. 이것이 최선의 방법이지만 위에 표시된 것처럼지도 함수가 아무 것도 방출 할 필요가 없으며 여기에 표시된대로 논리의 조건을 기반으로 방출 할 수 있습니다. –