복붙노트

[MONGODB] 사용자 정의 함수는 열 MongoDB를 투사을 계산

MONGODB

사용자 정의 함수는 열 MongoDB를 투사을 계산

나는 컬렉션의 열에 대한 사용자 정의 기능을 사용하여 계산 열을 얻기 위해 프로젝션을 사용하려고하지만 난 그것을 수행하는 방법 방법 그림에는 지원되지 않았 음. 내가 할 수있는 것은 이것이다 :

db.collection.aggregate([$project:{column1:1, calculatedCol: {$literal:[ jaro_Winkler("how to access column name")]}] )

내가 지금 나와 함께 코드를 가지고 있지 않기 때문에 코드는 구문 오류가있을 수 있습니다.

해결법

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

    1.당신은 집계 파이프 라인에서 자바 스크립트 함수를 호출 할 수 있습니다 생각하는 것,하지만 당신은이 작업을 수행 할 수 없습니다. 당신은 실제로 파이프 라인 내에서 실행을위한 함수 결과에서 변수의 "보간"무엇을 착각하고 있습니다.

    당신은 집계 파이프 라인에서 자바 스크립트 함수를 호출 할 수 있습니다 생각하는 것,하지만 당신은이 작업을 수행 할 수 없습니다. 당신은 실제로 파이프 라인 내에서 실행을위한 함수 결과에서 변수의 "보간"무엇을 착각하고 있습니다.

    예를 들어 내가 이렇게 할 경우 :

    var getNumbers = function() { return [ 1,2,3 ] };
    

    그런 다음이 전화 :

    db.collection.aggregate([
        { "$project": {
            "mynums": getNumbers()
        }}  
    ])
    

    그리고 실제로 자바 스크립트에서 무슨 일이 명령이 다음과 같이 서버로 전송됩니다 "전에"값이 "보간"를하고있다 쉘 :

    db.collection.aggregate([
        { "$project": {
            "mynums": [1,2,3]
        }}  
    ])
    

    더 그것을 설명하기 위해, 서버의 기능을 "만"은 저장 :

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

    그런 다음 집계 문을 실행하려고 :

    db.collection.aggregate([
        { "$project": {
            "greeting": hello()
        }}  
    ])
    

    그리고 그 예외가 발생합니다 :

    어떤 실행이 "클라이언트"가 아니라 "서버"클라이언트에 존재하지 않는 기능에 무슨 일이 일어나고 있기 때문이다.

    그렇게 할 수있는 조항이 없다으로 집계 프레임 워크는 자바 스크립트를 실행할 수 없습니다. 모든 작업은 어떤 자바 스크립트 엔진이 호출되고 있지으로, 네이티브 코드에서 수행된다. 따라서 대신이 연산자를 사용합니다 :

    db.collection.aggregate([
        { "$project": {
            "total": { "$add": [ 1, 2 ] },
            "field_total": { "$subtract": [ "$gross", "$tax" ] }
        }}  
    ])   
    

    그런 다음 결과를 acheive하기 위해 연산자를 사용할 수없는 경우 유일한 방법은 자바 스크립트 코드는 물론 컬렉션에서 데이터를 인터페이스에 자바 스크립트 엔진을 사용하는 대신 맵리 듀스를 실행하는 것입니다 실행할 수 있습니다. 당신이 필요로하는 경우 그리고 거기에서 당신은 또한 당신의 논리 내부의 서버 측 기능을 referce 수 있습니다 :

    { "key": 1, "value": 1 },
    { "key": 1, "value": 2 },
    { "key": 1, "value": 3 }
    
    db.system.js.save({ "_id": "square", "value": function(num) { return num * num } })
    
    db.collection.mapReduce(
        function() {
            emit(this.key,square(this.value))
        },
        function(key,values) {
            return Array.sum(values);
        },
        { "out": { "inline": 1 } }
    )
    

    보고:

    {
        "_id": 1,
        "value": 14
    }
    

    이에 대해되지 않도록하지만 정말 통합 프레임 워크는 어떤 식 으로든에서 자바 스크립트를 지원하지 않는다는 사실에 대해 "어떻게 필드 값을 전달합니다", 그리고 당신이 일어나고 있다고 생각하는 것은 사실이 아니다입니다.

  2. from https://stackoverflow.com/questions/31620582/custom-functions-calculated-columns-mongodb-projection by cc-by-sa and MIT license