首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从职员换班nodejs mongodb制作槽位

如何从职员换班nodejs mongodb制作槽位
EN

Stack Overflow用户
提问于 2021-10-11 08:26:57
回答 1查看 73关注 0票数 0

我正在开发一个沙龙预订系统。沙龙有多个员工,每个员工都有自己的班次。(我因为午休而休息,如果不对劲,请告诉我你的想法,谢谢)

代码语言:javascript
复制
shift: [
  {
    id: 1,
    day: 'Mon',
    status: true,
    shift: [
      {startTime: '08:00 am', endTime: '01:00 pm'},
      {startTime: '02:00 pm', endTime: '05:00 pm'},
    ],
  },
  {
    id: 2,
    day: 'Tue',
    status: true,
    shift: [
      {startTime: '08:00 am', endTime: '01:00 pm'},
      {startTime: '02:00 pm', endTime: '05:00 pm'},
    ],
  },
  {
    id: 3,
    day: 'Wed',
    status: true,
  },
  {
    id: 4,
    day: 'Thu',
    status: true,
    shift: [
      {startTime: '08:00 am', endTime: '01:00 pm'},
      {startTime: '02:00 pm', endTime: '05:00 pm'},
    ],
  },
  {
    id: 5,
    day: 'Fri',
    status: true,
    shift: [
      {startTime: '08:00 am', endTime: '01:00 pm'},
      {startTime: '02:00 pm', endTime: '05:00 pm'},
    ],
  },
  {
    id: 6,
    day: 'Sat',
    status: false,
    shift: [],
  },
  {
    id: 7,
    day: 'Sun',
    status: false,
    shift: [],
  },
]

现在我的目标是向用户发送插槽,如果用户预订了任何插槽,那么如何标记预订的插槽,而不是在其他人要求插槽时发送预订的插槽。我在这个项目中使用express.js MongoDB,谢谢。

Q1)如何将班次转换为用户的槽位?

Q2)如果用户预订了任何空位,如何标记已预订?

Q3)如果用户要求只发送可用时隙,如何不发送已预订的时隙?

EN

回答 1

Stack Overflow用户

发布于 2021-10-11 09:28:51

数据

代码语言:javascript
复制
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
    }
  ]
}

聚合

代码语言:javascript
复制
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
      }
    }
  }
])

结果

代码语言:javascript
复制
[
  {
    "_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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69523132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档