MongoDb Aggregation 조회에서 let에 특별한 형식이 필요합니까?

Aug 18 2020

상관 관계가없는 하위 쿼리와 함께 MongoDB $ lookup을 사용하려고합니다.
MongoDB 3.6.12 사용 (3.6에서 지원 시작)https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries

다음 파이프 라인 단계는 작동하지만 첫 번째 "userB"를 두 번째로 바꾸면 결과가 반환되지 않습니다.

{
from: 'friendships',
let: { requestuser: ObjectId("5c0a9c37b2365a002367df79"), postuser: ObjectId("5c0820ea17a69b00231627be") },
pipeline: [
   { 
        $match : { 
            $or : [ { "userA" : ObjectId("5c0820ea17a69b00231627be"), "userB" : ObjectId("5c0a9c37b2365a002367df79") // "userB" : '$$requestuser'
                }, 
                { 
                    "userA" : ObjectId("5c0a9c37b2365a002367df79"), 
                    "userB" : ObjectId("5c0820ea17a69b00231627be")
                }
            ], 
            "accepted" : true
        }
    },
    {
   $project: {v: 'true'}
    }
 ],
as: "match"}

하드 코딩 된 ObjectId를 사용한 결과 :

"match" : [
        {
            "_id" : ObjectId("5d6171dd319401001fd326bf"), 
            "v" : "true"
        }
    ]

변수를 사용한 결과 :

"match" : [

    ]

ObjectId에 특별한 대우가 필요하다고 생각합니다. 내가 찾을 수있는 모든 예는 문자열과 같은 간단한 변수를 사용하는 것입니다.

'$$ requestUser'에 값이 포함되어 있는지 확인하기 위해 프로젝션에서 테스트했습니다.

"match" : [
        {
            "_id" : ObjectId("5d6171dd319401001fd326bf"), 
            "v" : ObjectId("5c0a9c37b2365a002367df79")
        }
    ]

답변

2 varman Aug 18 2020 at 11:18

연관되지 않은 하위 쿼리를 사용 $expr하는 경우 변수를 전달 하기 위해을 사용해야 합니다. 다음과 같은 것을 시도 할 수 있습니다.

{
    $match: {
      $expr: { $or: [
            { 
                $and:[ { $eq: [ "userA", ObjectId("5c0820ea17a69b00231627be") ]
                  },
                  {
                    $eq: [ "userB", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", "$$requestuser" ] } ] }, { $and:[
                  {
                    $eq: [ "userA", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", ObjectId("5c0820ea17a69b00231627be") ]
                  }
                ]
            }
          
          
        ]
      },
      "accepted": true,
      
    }
  }

내가 어떻게 보여주기 위해 샘플 데모를 만들었습니다 $expr내부 작동 lookup: 상관 관계가 지정되지 않은 하위 쿼리의 샘플 데모