2014-09-16 3 views
1

컬렉션 :mongodb의 집계 함수를 호출합니까?

[ 
    { _id: "Foo", flag1: false, flag2: true, flag3: false }, 
    { _id: "Bar", flag1: true, flag2: false, flag3: true } 
] 

내 질문이있다가 집계 쿼리 내부의 메소드를 호출 할 수 있습니다?

aggregate({ 
    $project: { 
     '_id': 1, 
     'status' MyService.getStatus($flag1, $flag2, $flag3) 
    } 
}); 

가능한 경우 구문은 무엇입니까? 결과 : 내 실제 응용 프로그램에서

[ 
    { _id: "Foo", status: 'ok' }, 
    { _id: "Bar", status: 'broken' } 
] 

나는 문서 당 10 개 부울 플래그가 있습니다. 사용자가이 문서를 얻는다면 나는 플래그를 변환하고 (사용자에게) 의미를 부여하고 싶습니다. 예 : 문서가 타이어를 대표한다고 생각해보십시오.

flag1 = true means tire have good pressure, false means low pressure 
flag2 = true means depth of tire profile is good, false means little profile 
and so on 

그래서 요약 나는 경우

flag1, flag2 are false and flag3 is true 

때 문서

flag1, flag2 are true and flag3 is false 

및 타이어를 교체해야 할 경우 타이어가 OK라고 (BROKEN 또는 교체)하고 싶은 플래그가 제거되어야하는 사용자에게 리턴됩니다. 대신 우리는 타이어가 OK 또는 BROKEN 중 하나라는 상태 필드를 가지고 있습니다.

+0

아니요 어떻게 작동합니까? BSON 문서 만. 사람들은 쉘에서 이와 같은 것을 발표하고 처음에 평가한다는 것을 깨닫지 못해서 혼란스러워합니다. 당신이 실제로 여기에서 원하는 것은 당신이 기능이 필요하다고 생각하는 이유입니다. 가능성이 결정하는 것은 ** 해당 필드 중 하나 ** 사실입니까? –

+0

@NeilLunn이 함수는 부울 식으로 플래그를 확인하고 문자열을 반환합니다. 나는이 부울 플래그 중 약 10 개를 내 문서에 가지고 있는데, 나는이 모든 것을 하나로 모으고 싶다. "아마도 그 분야 중 하나가 무엇인지를 판단하는 것이 맞습니까?" 어떻게 생겼지? –

+0

아직 무엇을 하려는지 확실하지 않습니다. 왜 첫 번째 문서는 "ok"이고 두 번째 문서는 "broken"입니까?자신의 질문을 편집하는 것이 더 낫다는 것을 설명하는 것이 더 좋으며, 그렇게했을 때 주석으로 알릴 수 있습니다. 분명히 우리는 집계 프레임 워크가 어떻게 그것을 수행하는지 "당신의 논리를 구현"할 필요가 있습니다. 그러나 질문은 "반환 된 값의 논리는 무엇입니까?" –

답변

4

외부 함수는 집계 프레임 워크에서 작동하지 않습니다. 입력시 BSON으로 모든 것이 파싱되므로 JavaScript 나 다른 어떤 것도 허용되지 않습니다. 이것은 기본적으로 BSON "operator"정의에서 네이티브 C++ 코드 구현으로 처리되므로 정말 빠릅니다.

예상되는 논리를 집계 프레임 워크가 처리 할 수있는 것으로 변환하는 것입니다. 이와 맥락에서 작동 $or$and 같은 사실 "논리적"사업자에 있습니다

db.collection.aggregate([ 
    { "$project": { 
     "_id": 1, 
     "status": { 
      "$cond": [ 
       { "$or": [ 
        // Your first set of rules requires "false" for "flag1" or 
        // "flag2" and "true" for "flag3" 
        { "$and": [ 
         { "$not": [ 
          { "$or": [ "$flag1", "$flag2" ] }, 
         ]}, 
         "$flag3" 
        ]}, 
        // Your second set of rules requires "true" for "flag1" or 
        // "flag2" and "false" for "flag3" 
        { "$and": [ 
         { "$or": [ "$flag1", "$flag2" ] }, 
         { "$not": [ "$flag3" ] } 
        ]}, 
       ]}, 
       "ok", 
       "broken" 
      ] 
     } 
    }} 
]) 

그래서 외부 함수는 단지 사업자 집계 프레임 워크 소모품을 사용하여 로직을 구현합니다. 기본 논리 구현에 더하여, true/false 평가와 다른 결과를 제공하기 위해 "ternary"의 역할을하는 $cond이 의 역할을 수행하는 $not이 있습니다.

+0

제 함수는 문자열 배열입니다.이 배열의 문자열 중 '$ name'과 같은 일부 필드의 하위 문자열이 몇 개 있는지 계산하십시오. 제공된 운영자와 어떻게이 논리를 만들었습니까? – matheuscscp

1

집계 호출은 집계가 완료된 후에 호출되는 콜백 함수를 전달할 수 있습니다.

function getValuesAndMessges(params, callback) { 

    db.collection.aggregate([ 
    { "$project": { 
     "_id": 1, 
     "flag1": { "$first": "$flag1" }, 
     "flag2": { "$first": "$flag2" }, 
     "flag3": { "$first": "$flag3" }, 
    }} 
    ], function(err, results) { 
    if (!err) { 
     result.forEach(result => { 
     // process items in results here, setting a value 
     // using the actual logic for writing message ... 
     if(flag1) 
      result.message = "broken"; 
     else 
      result.messsge = 'OK'; 
     }); 
    } 
    callback(err, results); 
    }); 
} 

집계 된 각 항목은 (당신의 조건/매개 변수를 기반으로)이 방법은 메시지 속성이 (또는 당신이 쓰고 무엇을 선택 속성)을 설정하고 당신은 당신의 전화 기능에 사용할 수 있습니다.

관련 문제