2012-11-04 3 views
6

나는 MongoDB 우리의 웹 서버 로그를 저장하고 스키마는 다음과 유사합니다

[ 
    { 
    "_id" : 12345, 
    "url" : "http://www.mydomain.com/xyz/abc.html", 
    .... 
    }, 
    .... 
] 

내가 전달을 시작하기 전에이 스키마를 조금 바꿀하기 위해 $project 연산자를 사용하는 것을 시도하고있다 집계 파이프 라인을 통한 나의 수집. 기본적으로 group-by를 수행하는 데 사용되는 "type"이라는 새 필드를 추가해야합니다. 새로운 분야의 논리는 매우 간단합니다. (사용자 정의 JS 함수에 "keyf"속성을 설정하여

db.weblog.aggregate(
    { 
    $project : { 
     type : { /* how to implement the logic??? */ } 
    } 
    } 
); 

내가지도-감소하여이 작업을 수행하는 방법을 알고

if "url" contains "pattern_A" then set "type" = "sales lead"; 
else if "url" contains "pattern_B" then set "type" = "existing client"; 
... 

나는 이런 식으로 뭔가 할 것입니다 생각하고 있어요 위의 논리를 구현하지만) 이제는 new aggregation framework을 사용하여이 작업을 수행하려고합니다. expression operators을 사용하여 로직을 구현하려고했지만 지금까지 작동시키지 못했습니다. 어떤 도움이나 제안이라도 대단히 감사하겠습니다!

답변

0

여러 연산자와 표현식을 사용해야합니다.

첫째, $project$cond 연산자를 사용하면 다음 다른 논리 경우 구현할 수 있습니다.

$cond : 첫 번째 부울 식, 두 번째 및 세 번째는 필드 값에 사용할 값입니다. 부울식이 참이면 세 번째 요소가 아닌 값의 두 번째 요소를 사용합니다. 당신이 둥지 수

이 그 세 번째 요소는 자체 얻을 수있는 $cond 표현을하므로 경우 - 당시 다른-IF-다음-등.

문자열 조작이 조금 어색하지만 당신은 $substr 사용할 수 있습니까. 당신이 정확하게 뭘하려 몇 가지 예를 게시 할 경우

, 나는 그것이 작동하지 않는 이유를 발견 할 수 있습니다.

+0

감사합니다. 당신의 제안은 제가 시도한 첫 번째 시도 였고, 지원되는 문자열 연산자를 사용하여 문자열 패턴의 존재를 검사 할 수 없다는 것을 깨달았을 때 막 다른 골목을 빨리 쳤습니다.url의 특정 패턴을 찾기 위해 indexOf()와 같은 것이 필요하다. – Edenbauer

+0

하위 문자열은 "url"에서 어디에 나타날 수 있습니까? 문서를 처음 작성한 시점에 저장할 수있는 것이 있습니까? –

+0

나는 비슷한 상황에 처해있다. 나는 두 개의 필드 A와 B를 가지고 있으며 문서에있는 필드는 상호 배타적입니다. A가있을 때 A로 그룹화하고 B가있을 때 B로 그룹화해야하지만 $ 프로젝트에 $ cond를 가질 수없는 것처럼 보입니다. $ 프로젝트를 두 가지 방법으로 작성했습니다 : {$ project : {MyKey {$ cond : [{$ condates : {$ condates : {$ condates : {$ { "errmsg": "예외 : 연산자 '$ exists'이 (가) 잘못되었습니다.", {$ exists "true}},"$ A ","$ B "]}}} 계속 오류가 발생합니다. "code": 15999, "ok": 0 } ... 아마도 그것은 단지 성가신 구문 일뿐입니다. ( –

1

나는 경우 다른 사람에 내 "솔루션"을 공유하고 내 같은 같은 요구를 발생합니다.

@로, 주 동안 연구 한 후에하기 Asya-kamsky 자신의 의견 중 하나에 제안, 나는 내 원래 MongoDB의 스키마에 계산 필드를 추가하기로 결정했습니다. 계산 된 필드에 대한 논리가 변경 될 때마다 제 컬렉션의 모든 문서를 업데이트하기 위해 일괄 업데이트를해야하지만 MapReduce를 사용하도록 코드를 다시 작성했기 때문에 이상하지 않습니다. 나는 지금을 위해 전을 선택했다. MongoDB를 락스의 보드에서 찾고, 많은 사람들이 $project 운영자 추가 할 더 다양한 사업자를 요구 한 것으로 나타납니다 그리고 나는 확실히 빨리

Operator for splitting string based on a separator.

늦어도에 추가로 MongoDB의 팀 dev 주위에 얻을 수 있기를 바랍니다 답장을 보내

Allow $slice operator in $project

New projection operator $elemMatch

add a $inOrder operator to $project