【问题标题】:how to make slot from staff shift nodejs mongodb如何从员工轮班nodejs mongodb制作插槽
【发布时间】:2021-10-11 08:26:57
【问题描述】:

我正在开发沙龙预订系统。沙龙有多名员工,每个员工都有自己的轮班。 (我会因为午休时间休息,如果不合适请告诉我你的想法谢谢)

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) 如何为用户转换 shift 到 slot?

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

Q3) 如果用户要求,如何不发送预定槽位,只发送可用槽位?

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    数据

    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

    【讨论】:

    • 换班进入插槽,例如以 1 小时间隔 08:00、09:00、10:00、11:00 .....
    • 我通过改变数据结构来更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2023-02-22
    • 2018-11-10
    • 1970-01-01
    相关资源
    最近更新 更多