数据
db={
"employees": [
{
"_id": 1,
shift: [
{
id: 1,
day: "Mon",
status: true,
shift: [
{
startTime: "08:00 am",
endTime: "09:00 pm"
},
{
startTime: "9:00 am",
endTime: "10:00 pm"
},
{
startTime: "10:00 am",
endTime: "11:00 pm"
},
{
startTime: "11:00 am",
endTime: "12:00 pm"
},
{
startTime: "12:00 pm",
endTime: "01:00 pm"
},
{
startTime: "02:00 pm",
endTime: "03:00 pm"
},
{
startTime: "03:00 pm",
endTime: "04:00 pm"
},
{
startTime: "04:00 pm",
endTime: "05:00 pm"
}
]
},
{
id: 2,
day: "Tue",
status: true,
shift: [
{
startTime: "08:00 am",
endTime: "09:00 pm"
},
{
startTime: "9:00 am",
endTime: "10:00 pm"
},
{
startTime: "10:00 am",
endTime: "11:00 pm"
},
{
startTime: "11:00 am",
endTime: "12:00 pm"
},
{
startTime: "12:00 pm",
endTime: "01:00 pm"
},
{
startTime: "02:00 pm",
endTime: "03:00 pm"
},
{
startTime: "03:00 pm",
endTime: "04:00 pm"
},
{
startTime: "04:00 pm",
endTime: "05:00 pm"
}
]
},
{
id: 3,
day: "Wed",
status: true,
},
{
id: 4,
day: "Thu",
status: true,
shift: [
{
startTime: "08:00 am",
endTime: "09:00 pm"
},
{
startTime: "9:00 am",
endTime: "10:00 pm"
},
{
startTime: "10:00 am",
endTime: "11:00 pm"
},
{
startTime: "11:00 am",
endTime: "12:00 pm"
},
{
startTime: "12:00 pm",
endTime: "01:00 pm"
},
{
startTime: "02:00 pm",
endTime: "03:00 pm"
},
{
startTime: "03:00 pm",
endTime: "04:00 pm"
},
{
startTime: "04:00 pm",
endTime: "05:00 pm"
}
]
},
{
id: 5,
day: "Fri",
status: true,
shift: [
{
startTime: "08:00 am",
endTime: "09:00 pm"
},
{
startTime: "9:00 am",
endTime: "10:00 pm"
},
{
startTime: "10:00 am",
endTime: "11:00 pm"
},
{
startTime: "11:00 am",
endTime: "12:00 pm"
},
{
startTime: "12:00 pm",
endTime: "01:00 pm"
},
{
startTime: "02:00 pm",
endTime: "03:00 pm"
},
{
startTime: "03:00 pm",
endTime: "04:00 pm"
},
{
startTime: "04:00 pm",
endTime: "05:00 pm"
}
]
},
{
id: 6,
day: "Sat",
status: false,
shift: [],
},
{
id: 7,
day: "Sun",
status: false,
shift: [],
},
]
}
],
"bookings": [
{
"_id": 1,
"employee_id": 1,
"day_id": 2,
"slot": 3
},
{
"_id": 2,
"employee_id": 1,
"day_id": 5,
"slot": 4
}
]
}
聚合
db.employees.aggregate([
{
"$unwind": {
path: "$shift"
}
},
{
"$unwind": {
path: "$shift.shift",
includeArrayIndex: "arrayIndex"
}
},
{
"$lookup": {
from: "bookings",
let: {
arrayIndex: "$arrayIndex",
shift_id: "$shift.id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$$shift_id",
"$day_id"
]
},
{
$eq: [
"$$arrayIndex",
"$slot"
]
}
]
}
}
}
],
as: "bookings"
}
},
{
"$match": {
"bookings": {
"$size": 0
}
}
}
])
结果
[
{
"_id": 1,
"arrayIndex": NumberLong(0),
"bookings": [],
"shift": {
"day": "Mon",
"id": 1,
"shift": {
"endTime": "01:00 pm",
"startTime": "08:00 am"
},
"status": true
}
},
{
"_id": 1,
"arrayIndex": NumberLong(1),
"bookings": [],
"shift": {
"day": "Mon",
"id": 1,
"shift": {
"endTime": "05:00 pm",
"startTime": "02:00 pm"
},
"status": true
}
},
{
"_id": 1,
"arrayIndex": NumberLong(1),
"bookings": [],
"shift": {
"day": "Tue",
"id": 2,
"shift": {
"endTime": "05:00 pm",
"startTime": "02:00 pm"
},
"status": true
}
},
{
"_id": 1,
"arrayIndex": NumberLong(0),
"bookings": [],
"shift": {
"day": "Thu",
"id": 4,
"shift": {
"endTime": "01:00 pm",
"startTime": "08:00 am"
},
"status": true
}
},
{
"_id": 1,
"arrayIndex": NumberLong(1),
"bookings": [],
"shift": {
"day": "Thu",
"id": 4,
"shift": {
"endTime": "05:00 pm",
"startTime": "02:00 pm"
},
"status": true
}
},
{
"_id": 1,
"arrayIndex": NumberLong(0),
"bookings": [],
"shift": {
"day": "Fri",
"id": 5,
"shift": {
"endTime": "01:00 pm",
"startTime": "08:00 am"
},
"status": true
}
}
]
如果你想问如何使用这个数据结构来查询具体的数据,请给出查询参数和预期输出,我会添加查询功能。
mongoplayground