복붙노트

[MONGODB] 전화하여 MongoDB의 집계 내부 기능?

MONGODB

전화하여 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

그래서 요약 나는 타이어는 경우 OK입니다 말씀을 전합니다

 flag1, flag2 are true and flag3 is false

및 타이어 요구 경우 (파선 또는 교환) 교체 할

flag1, flag2 are false and flag3 is true

문서가 사용자에게 반환 할 때 플래그를 제거해야합니다. 대신 우리는 타이어가 하나 OK 또는 고장 말한다 상태 필드가 있습니다.

해결법

  1. ==============================

    1.외부 기능은 통합 프레임 워크를 작동하지 않습니다. 모든 것은, 입력에 BSON으로 분석 자바 스크립트가 너무 나 다른 어떤이 허용됩니다된다. 정말 빠르고, 그래서 이것은 모든 기본적으로 네이티브 C ++ 코드 구현에 BSON "연산자"정의에서 처리됩니다.

    외부 기능은 통합 프레임 워크를 작동하지 않습니다. 모든 것은, 입력에 BSON으로 분석 자바 스크립트가 너무 나 다른 어떤이 허용됩니다된다. 정말 빠르고, 그래서 이것은 모든 기본적으로 네이티브 C ++ 코드 구현에 BSON "연산자"정의에서 처리됩니다.

    이것이 내려 온다 집계 프레임 워크가 처리 할 수있는 무엇에 기대 로직을 "변환"입니다. 같은 $ 또는과 $이 맥락에서 그 작품으로 사실 "논리적"사업자에 있습니다 :

    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"
               ]
           }
        }}
    ])
    

    어떤 외부 함수 그래서 그냥 통합 프레임 워크를 공급하는 사업자와 로직을 구현한다. 기본적인 논리 구현 외에도 허 / 평가와는 다른 결과를 제공하기 위해 없음 "역방향"를, 로직 및 "원"으로 작용 $ COND에 $있다.

  2. ==============================

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

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

    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);
      });
    }
    

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

  3. ==============================

    3.그래, 우리는 간단한 방법으로 집계 프로젝트에 함수를 호출 할 수 있습니다.

    그래, 우리는 간단한 방법으로 집계 프로젝트에 함수를 호출 할 수 있습니다.

    let getStatus = (flag) => {
        return flag=='ok' ? 'ok' :'broken';
    }
    aggregate({
        $project: {
            '_id': 1,
            'status': getStatus($flag3)
        }
    });
    
  4. from https://stackoverflow.com/questions/25865788/call-function-inside-mongodbs-aggregate by cc-by-sa and MIT license