我有 2 個收藏
第一用戶和第二班次
當我使用查找和展開運算式撰寫如下查詢時。
results.users = await model.aggregate([
{
$match: filter,
},
{
$lookup: {
from: "shifts",
localField: "_id",
foreignField: "employeeId",
as: "shifts",
},
},
{
$unwind: { path: "$shifts", preserveNullAndEmptyArrays: true },
},
]);
我得到的回應,正如您在下面看到的,我多次獲得最后一個用戶,因為它有多個日期的多個班次資料,而在前兩個資料中,我沒有得到任何班次資料,因為該用戶不存在資料,這是正確的。
[
{
_id: "60dd781c4524e6c116e2336d",
workerFirstName: "MADASWAMY",
workerSurname: "KARUPPASWAMY",
workerId: "1002",
},
{
_id: "60dd781d4524e6c116e234d4",
workerFirstName: "AMIT",
workerSurname: "SHAH",
workerId: "1001",
},
{
_id: "60dd781d4524e6c116e23642",
workerFirstName: "DEVELOPER",
workerSurname: "DEVELOPER",
workerId: "7738",
shifts: {
_id: "634d8d3ce596dd34c9532d7d",
month: "October",
workerId: "7738",
date: "2022-10-01T00:00:00.000Z",
},
},
{
_id: "60dd781d4524e6c116e23642",
workerFirstName: "DEVELOPER",
workerSurname: "DEVELOPER",
workerId: "7738",
shifts: {
_id: "634d8d3ce596dd34c9532d6d",
month: "October",
workerId: "7738",
date: "2022-10-02T00:00:00.000Z",
},
},
{
_id: "60dd781d4524e6c116e23642",
workerFirstName: "DEVELOPER",
workerSurname: "DEVELOPER",
workerId: "7738",
shifts: {
_id: "634d8d3ce596dd34c9532d5c",
month: "October",
workerId: "7738",
date: "2022-10-31T00:00:00.000Z",
},
},
]
當我撰寫以下查詢時,在查找和展開后使用匹配運算式。
results.users = await model.aggregate([
{
$match: filter,
},
{
$lookup: {
from: "shifts",
localField: "_id",
foreignField: "employeeId",
as: "shifts",
},
},
{
$unwind: { path: "$shifts", preserveNullAndEmptyArrays: true },
},
{
$match: {
"shifts.date": new Date(formatTimeToIso(new Date())),
},
},
]);
我得到的回應只有 1 個資料,這也是正確的,因為匹配運算式就是這樣作業的。
[
{
_id: "60dd781d4524e6c116e23642",
workerFirstName: "DEVELOPER",
workerSurname: "DEVELOPER",
workerId: "7738",
shifts: {
_id: "634d8d3ce596dd34c9532d5d",
month: "October",
workerId: "7738",
date: "2022-10-31T00:00:00.000Z",
},
},
]
但是我想要的回應應該類似于下面的回應,因此可以從運算式中添加或洗掉任何內容,以便我可以獲取所需格式的資料
[
{
_id: "60dd781c4524e6c116e2336d",
workerFirstName: "MADASWAMY",
workerSurname: "KARUPPASWAMY",
workerId: "1002",
shifts:{}
},
{
_id: "60dd781d4524e6c116e234d4",
workerFirstName: "AMIT",
workerSurname: "SHAH",
workerId: "1001",
shifts:{}
},
{
_id: "60dd781d4524e6c116e23642",
workerFirstName: "DEVELOPER",
workerSurname: "DEVELOPER",
workerId: "7738",
shifts: {
_id: "634d8d3ce596dd34c9532d5d",
month: "October",
workerId: "7738",
date: "2022-10-31T00:00:00.000Z",
},
},
]
uj5u.com熱心網友回復:
假設在這個$lookup階段之后你會得到這個結果:
[
{
_id: "60dd781c4524e6c116e2336d",
workerFirstName: "MADASWAMY",
workerSurname: "KARUPPASWAMY",
workerId: "1002",
},
{
_id: "60dd781d4524e6c116e234d4",
workerFirstName: "AMIT",
workerSurname: "SHAH",
workerId: "1001",
},
{
_id: "60dd781d4524e6c116e23642",
workerFirstName: "DEVELOPER",
workerSurname: "DEVELOPER",
workerId: "7738",
shifts: [
{
_id: "634d8d3ce596dd34c9532d7d",
month: "October",
workerId: "7738",
date: "2022-10-01T00:00:00.000Z",
},
{
_id: "634d8d3ce596dd34c9532d6d",
month: "October",
workerId: "7738",
date: "2022-10-02T00:00:00.000Z",
},
{
_id: "634d8d3ce596dd34c9532d5c",
month: "October",
workerId: "7738",
date: "2022-10-31T00:00:00.000Z",
}
]
}
]
階段結束后$lookup:
$setshifts-通過過濾檔案來設定陣列$filter。$unwind- 解構shifts陣列。
results.users = await model.aggregate([
// $match stage,
// $lookup stage
{
$set: {
shifts: {
$filter: {
input: "$shifts",
cond: {
$eq: [
"$$this.date",
new Date(formatTimeToIso(new Date()))
]
}
}
}
}
},
{
$unwind: {
path: "$shifts",
preserveNullAndEmptyArrays: true
}
}
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523323.html
上一篇:如何獲得兩個日期之間的年份?
