MongoDB获得餐厅的剩余席位

时间:2019-09-19 07:33:01

标签: node.js mongodb mongoose

我很难在特定的Date range

中找到特定餐厅的剩余席位

让我定义我的问题。假设我有一个名为booking

的集合

在此具有以下字段:

  • 预订ID
  • 用户ID
  • 餐厅ID
  • 预订开始日期(保存在时间戳中的日期)
  • 预订结束日期(保存在时间戳记中的日期)
  • 预订座位

enter image description here

如果餐厅有 50 个座位。我想检查特定日期范围的可用座位,例如日期范围为 6-12 (此范围(时间戳))“(开始日期)-(结束日期)”

如何计算餐厅的剩余总席位。

如果有人有任何想法,请告诉我。

预先感谢

代码在这里

const where = {};
where.restaurant_id = 126;
where.user_id = 1;
where.start_date = { $gte: 6 };
where.end_date = { $gte: 12 };
const remainingSeats = getSeatsAvailability(where);

function getSeatsAvailability(where) {
  return new Promise((resolve, reject) => {
    bookingModel.find(where, (err, details) => {
      if (err) { reject(err); } else { resolve(details); }
    });
  });
}

2 个答案:

答案 0 :(得分:1)

因此,我所看到的是下图,因此基本上涵盖了四种情况:

            x            y
a-----------|---------b  |
          a-|------------|---b
            |  a-------b |
            |      a-----|--------b

因此公式为:

1. a<x, a<y | b>x, b<y
2. a<x, a<y | b>x, b>y
3. a>x, a<y | b>x, b>y
4. a>x, a<y | b<y, b>x

我正在粘贴一个 ROUGH 示例,以此作为解决当前问题的提示:

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          a: {
            $lte: 3,
            $lte: 9
          },
          $or: [
            {
              b: {
                $gte: 3,
                $lte: 9
              }
            },
            {
              b: {
                $gte: 3,
                $gte: 9
              }
            }
          ]
        },
        {
          a: {
            $gte: 3,
            $lte: 9
          },
          $or: [
            {
              b: {
                $gte: 3,
                $gte: 9
              }
            },
            {
              b: {
                $gte: 3,
                $lte: 9
              }
            }
          ]
        }
      ],
      r: 1
    }
  },
  {
    $group: {
      _id: null,
      sum_booked: {
        $sum: "$c"
      }
    }
  },
  {
    $project: {
      seats_left: {
        $subtract: [
          50,
          "$sum_booked"
        ]
      }
    }
  }
])

我测试过的示例数据集:

[
  {
    a: 1,
    b: 10,
    c: 10,
    r: 1,

  },
  {
    a: 2,
    b: 5,
    c: 15,
    r: 1
  },
  {
    a: 5,
    b: 10,
    c: 10,
    r: 1
  },
  {
    a: 7,
    b: 15,
    c: 15,
    r: 12 <<<<========/////DIFF REST ID
  }
]

输出:

[
  {
    "_id": null,
    "seats_left": 15
  }
]

答案 1 :(得分:0)

db.booking.aggregate([{
        $match: {
            BookingStartDate: { $lte: date_range_end },
            BookingEndDate: { $gte: date_range_start },
            RestaurantID: restaurant_id
        }
    },
    {
        $group: {
            _id: '$RestaurantID',
            TotalBookedSeat: { $sum: '$BookedSeat' }
        }
    },
    {
        $project: {
            LeftSeat: { $subtract: [50, '$TotalBookedSeat'] },
            _id: 0
        }
    }
])
{ "_id" : ObjectId("5d8479f6902a52448029a6d0"), "bid" : 1, "uid" : 1, "rid" : 126, "bsd" : 1, "bed" : 10, "bs" : 10 }
{ "_id" : ObjectId("5d847a11902a52448029a6d1"), "bid" : 2, "uid" : 1, "rid" : 126, "bsd" : 2, "bed" : 5, "bs" : 15 }
{ "_id" : ObjectId("5d847a24902a52448029a6d2"), "bid" : 3, "uid" : 1, "rid" : 126, "bsd" : 5, "bed" : 10, "bs" : 10 }
{ "_id" : ObjectId("5d847a34902a52448029a6d3"), "bid" : 4, "uid" : 1, "rid" : 126, "bsd" : 7, "bed" : 15, "bs" : 15 }

db.booking.aggregate([{ $match: { bsd: { $lte: 12 }, bed: { $gte: 6 }, rid: 126 } }, { $group: { _id: '$rid', total_seat_sold: { $sum: '$bs' } } }])

The result of the above is 35, then 15 seats left.

这一次我认为可以。

相关问题