共有三個集合。
離開
- _ID
- 用戶(參考用戶模型)
- 地位
離開批準
- _ID
- 離開(參考離開模型)
- auditUser(參考用戶模型)
- 角色
用戶
- _ID
- 姓名
對離開集合執行查找階段后:
Leave.aggregate([
$lookup: {
from: 'leaveapprovals',
localField: '_id',
foreignField: 'leave',
as: 'approverRecommender'
}
])
{
_id: ObjectId('6262851ab059b81fd9076532'),
user: ObjectId('21ca9490192add08fa385aec'),
status: "pending",
approverRecommender: [
{
_id: ObjectId('6262851ab059b81fd907653d'),
leave: ObjectId('6262851ab059b81fd9076532'),
auditUser: ObjectId('61ca9490192add08fa385aeb'),
role: "recommender"
},
{
_id: ObjectId('6262851ab059b81fd907653d'),
leave: ObjectId('6262851ab059b81fd9076532'),
auditUser: ObjectId('71ca9490192add08fa385aec'),
role: "approver"
}
]
}
我想要得到的結果是:
{
_id: ObjectId('6262851ab059b81fd9076532'),
user: ObjectId('21ca9490192add08fa385aec'),
status: "pending",
recommender: {
_id: ObjectId('61ca9490192add08fa385aeb'),
name: "Andrew"
},
approver: {
_id: ObjectId('71ca9490192add08fa385aec'),
name: "James"
}
}
我怎樣才能改變它?
uj5u.com熱心網友回復:
$lookup- 需要一個嵌套的$lookup. 首先$lookup用管道加入leave和leaveapprovals收集。而內部$lookup加入user集合和回傳auditUser和role欄位。$set-2.1。對于
approver欄位,過濾角色approverRecommender的陣列欄位approver并通過$first.2.2. 對于
recommender欄位,過濾角色approverRecommender的陣列欄位recommender并通過$first.$project- 裝飾輸出檔案。用于$first回傳第一個檔案,approver并且recommender從結果 2 開始,兩個欄位都回傳為陣列。
db.leave.aggregate([
{
$lookup: {
from: "leaveapprovals",
let: {
leaveId: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$$leaveId",
"$leave"
]
}
}
},
{
$lookup: {
from: "user",
localField: "auditUser",
foreignField: "_id",
as: "auditUser"
}
},
{
$project: {
auditUser: 1,
role: 1
}
}
],
as: "approverRecommender"
}
},
{
"$set": {
approver: {
"$first": {
"$filter": {
"input": "$approverRecommender",
"cond": {
$eq: [
"$$this.role",
"approver"
]
}
}
}
},
recommender: {
"$first": {
"$filter": {
"input": "$approverRecommender",
"cond": {
$eq: [
"$$this.role",
"recommender"
]
}
}
}
}
}
},
{
"$set": {
approver: {
"$first": {
"$filter": {
"input": "$approverRecommender",
"cond": {
$eq: [
"$$this.role",
"approver"
]
}
}
}
},
recommender: {
"$first": {
"$filter": {
"input": "$approverRecommender",
"cond": {
$eq: [
"$$this.role",
"recommender"
]
}
}
}
}
}
},
{
$project: {
_id: 1,
user: 1,
status: 1,
"approver": {
$first: "$approver.auditUser"
},
"recommender": {
$first: "$recommender.auditUser"
}
}
}
])
示例 Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/462407.html
