복붙노트

[MONGODB] 집계 파이프 라인에 저장된 자바 스크립트 기능을 사용하여, 맵리 듀스 또는 runCommand

MONGODB

집계 파이프 라인에 저장된 자바 스크립트 기능을 사용하여, 맵리 듀스 또는 runCommand

파이프 라인 또는 맵리 듀스에 db.system.js.save로 저장 사용자 정의 함수 (...)를 사용하는 방법이 있나요?

해결법

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

    1.당신이 system.js에 저장 모든 기능은 운전자와 맵리 듀스와 _id 값에 의해 참조 될 수는 asssigned되었다되는 위치를 $로 "자바 스크립트"문을 처리하여 사용 가능합니다.

    당신이 system.js에 저장 모든 기능은 운전자와 맵리 듀스와 _id 값에 의해 참조 될 수는 asssigned되었다되는 위치를 $로 "자바 스크립트"문을 처리하여 사용 가능합니다.

    db.system.js.save({ 
       "_id": "squareThis", 
       "value": function(a) { return a*a } 
    })
    

    그리고 일부 데이터는 "샘플"컬렉션에 삽입 :

    { "_id" : ObjectId("55aafd2bacbed38e06f9eccf"), "a" : 1 }
    { "_id" : ObjectId("55aafea6acbed38e06f9ecd0"), "a" : 2 }
    { "_id" : ObjectId("55aafeabacbed38e06f9ecd1"), "a" : 3 }
    

    그때:

    db.sample.mapReduce(
        function() {
           emit(null, squareThis(this.a));
        },
        function(key,values) {
            return Array.sum(values);
        },
        { "out": { "inline": 1 } }
     );
    

    제공합니다 :

       "results" : [
                {
                        "_id" : null,
                        "value" : 14
                }
        ],
    

    또는 $와 여기서

    db.sample.find(function() { return squareThis(this.a) == 9 })
    { "_id" : ObjectId("55aafeabacbed38e06f9ecd1"), "a" : 3 }
    

    하지만 "도"경우에 당신은 데이터베이스 DB를 참조 또는 다른 기능으로 전역을 사용할 수 있습니다. 모두 $와 맵리 듀스 문서는 당신이 여기에서 무엇을 할 수 있는지의 한계의 정보가 포함되어 있습니다. 당신은 당신이 "허용되지 않음"때문에 당신이 그것을 잊을 수있다 "다른 모음에서 찾아 볼 데이터"와 같은 일을 할 줄 알았는데 이렇게합니다.

    모든 MongoDB의 명령 조치가 실제로 어쨌든 "후드"는 "runCommand"조치를 호출합니다. 그러나이 명령은 실제로 "자바 스크립트 처리 엔진을 호출"되고하는 일은 그 사용이 부적절하게하지 않는. 이 맵리 듀스, 그룹 또는 평가되는이 작업을 수행 어쨌든 몇 명령이다, 어디 $와 과정의 찾기 작업.

    집계 프레임 워크는 전혀 어떤 식 으로든에서 자바 스크립트를 사용하지 않습니다. 당신은 다른 사람들이 당신이하지 생각하지 않는이 같은 문을 수행 한 것처럼 착각 될 수 있습니다

    db.sample.aggregate([
        { "$match": {
            "a": { "$in": db.sample.distinct("a") }
        }}
    ])
    

    즉 그래서 집계 파이프 라인 "내에서 실행되지"하지만 파이프 라인이 서버로 전송되기 전에 오히려 그 .distinct () 호출의 "결과"가 "평가"입니다. 외부 변수와 같은 대부분은 어쨌든 수행됩니다

    var items = [1,2,3];
    db.sample.aggregate([
        { "$match": {
            "a": { "$in": items }
        }}
    ])
    

    모두 본질적으로 같은 방법으로 서버에 전송 :

    db.sample.aggregate([
        { "$match": {
            "a": { "$in": [1,2,3] }
        }}
    ])
    

    그것은 "전화"집계 파이프 라인에있는 자바 스크립트 기능을 "불가능"입니다 않으며, 어느 시점이 거기에 정말입니다 그래서 system.js에 저장 무언가에서 일반적으로 결과 "전달". 은 "코드"의 요구는 실제로 아무것도 할 수 있습니다 만 자바 스크립트 엔진 "클라이언트에로드"합니다.

    맵리 듀스에 제공되는 "자유 형식"자바 스크립트 해석에 반대 집계 프레임 워크로, 사용할 수있는 "사업자"모든 사실은 기본적으로 기능을 코딩하고 있습니다. 그래서 그 대신 "자바 스크립트"를 작성, 당신은 사업자 스스로 사용

    db.sample.aggregate([
        { "$group": {
            "_id": null,
            "sqared": { "$sum": {
               "$multiply": [ "$a", "$a" ]
            }}
        }}
    ])
    
    { "_id" : null, "sqared" : 14 }
    

    그래서 당신이 system.js에 저장 기능을 수행 할 수있는 작업에 제한이 있고, 기회는 당신이하고 싶은 것은 중 하나입니다입니다 :

    그냥 정말 생각할 수있는 유일한 실제 사용에 대해 다른 방법을 수행 할 수 없습니다 "맵리 듀스"작업의 번호를 가지고 있고 당신은 당신이 아니라 단지마다 내에서 유지보다 서버에 저장하는 것이 기능을 "공유"다양한 가지고있다 맵리 듀스 함수 호출.

    하지만 다시, 집계 프레임 워크를 통해 맵리 듀스에 대한 90 %의 이유는 컬렉션의 "문서 구조가"제대로 선택되었으며 자바 스크립트 기능은 검색 및 분석을위한 문서를 통과 할 "필요"것이 보통이다.

    그래서 당신은 허용 제약 조건을 사용할 수 있지만, 대부분의 경우에 당신은 아마 전혀 이것을 사용하지만, 당신은 당신이 처음에이 기능을 필요로 믿고 발생하는 다른 문제를 해결 할 수 없습니다.

  2. from https://stackoverflow.com/questions/31496679/using-stored-javascript-functions-in-the-aggregation-pipeline-mapreduce-or-runc by cc-by-sa and MIT license