MongoDb Aggregation 조회에서 let에 특별한 형식이 필요합니까?
상관 관계가없는 하위 쿼리와 함께 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
연관되지 않은 하위 쿼리를 사용 $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
: 상관 관계가 지정되지 않은 하위 쿼리의 샘플 데모