복붙노트

[MONGODB] MongoDB의 : 통합 프레임 워크 : 필드 사이에 $ 일치

MONGODB

MongoDB의 : 통합 프레임 워크 : 필드 사이에 $ 일치

나는 두 문서와 테스트 컬렉션이 있습니다 :

> db.test.find().pretty()
{ "_id" : ObjectId("510114b46c1a3a0f6e5dd7aa"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("510114c86c1a3a0f6e5dd7ab"), "a" : 3, "b" : 1 }

통합 프레임 워크로, 나는 a가 b보다 큰 경우 문서 만 싶어. $ 하였다는 인수하지 필드에서만 값을 가져 ...

> db.test.aggregate([{"$match":{"$a":{"$gt":"$b"}}}])
{ "result" : [ ], "ok" : 1 } /* don't work*/

당신은 몇 가지 아이디어를 가지고 있습니까?

미리 감사드립니다

친애하는

해결법

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

    1.음, 내 말에 많은 테스트를하지 않고 당신이를 위해 $ CMP를 사용할 수 있습니다 말할 것이다 :

    음, 내 말에 많은 테스트를하지 않고 당신이를 위해 $ CMP를 사용할 수 있습니다 말할 것이다 :

    http://docs.mongodb.org/manual/reference/aggregation/cmp/#_S_cmp

    db.test.aggregate([
        {$project: {
            // All your other fields here
            cmp_value: {$cmp: ['$a', '$b']}
        }},
        {$match: {cmp_value: {$gt: 0}}} 
    ])
    

    거기에 더 나은 방법이 될 수도 있지만 나는 시험 날 근처 MongoDB를 설치 없어요.

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

    2.버전 3.6에 도입, 같은 문서에서 필드를 비교 쿼리 식을 구축 할 수 있습니다 $ EXPR.

    버전 3.6에 도입, 같은 문서에서 필드를 비교 쿼리 식을 구축 할 수 있습니다 $ EXPR.

    하나의 문서 (예 MongoDB를 문서 도구에서 직접 촬영)에서 두 필드를 비교 :

    다음의 서류와 함께 MONTHLYBUDGET 모음을 고려 :

    { "_id" : 1, "category" : "food", "budget": 400, "spent": 450 }
    { "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 }
    { "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 }
    { "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 }
    { "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
    

    다음 작업은 지출 금액이 예산을 초과하는 문서를 찾을 수 $ EXPR을 사용합니다 :

    db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
    

    동작은 다음과 같은 결과를 반환합니다 :

    { "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 }
    { "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 }
    { "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 }
    
  3. from https://stackoverflow.com/questions/14501337/mongodb-aggregation-framework-match-between-fields by cc-by-sa and MIT license