ในการค้นหา MongoDb Aggregation การปล่อยให้จำเป็นต้องมีการจัดรูปแบบพิเศษหรือไม่?
ฉันพยายามใช้ MongoDB $ lookup กับ Uncorrelated Subqueries
ใช้ 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" : [
]
ฉันรู้สึกว่า ObjectIds ต้องการการดูแลเป็นพิเศษ ตัวอย่างทั้งหมดที่ฉันหาได้คือการใช้ตัวแปรง่ายๆเช่นสตริง
ในการตรวจสอบว่า '$$ requestUser' มีค่าอยู่ฉันได้ทดสอบในการฉายภาพ:
"match" : [
{
"_id" : ObjectId("5d6171dd319401001fd326bf"),
"v" : ObjectId("5c0a9c37b2365a002367df79")
}
]
คำตอบ
เมื่อคุณใช้ Un-related sub queires คุณต้องใช้$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
: ตัวอย่างการสาธิตสำหรับการสืบค้นย่อยที่ไม่เกี่ยวข้อง