【问题标题】:MongoDB $addFields, add boolean field based on conditionMongoDB $addFields,根据条件添加布尔字段
【发布时间】:2020-12-15 06:41:23
【问题描述】:

我有一个包含开放时间的地点文件列表,详细信息如下:

  "openingTimes": {
    "Wednesday": [ // array of shifts
      {
        "startTime": { "hour": 1, "minute": 0 }, // shift starts
        "endTime": { "hour": 10, "minute": 0} //shift ends
      },
      {
        "startTime": { "hour": 15, "minute": 0 },
        "endTime": { "hour": 23, "minute": 59 }
      }
    ],
    "Thursday": [
      {
        "startTime": { "hour": 0, "minute": 0 },
        "endTime": { "hour": 23, "minute": 59 }
      }
    ],
  }

我需要添加一个字段来指示该地点现在是否开放,

{
 $addFields: {
  isOpenNow: {
      $and: [
    {
      $or: [
        {
          $lt: ['$openingTimes.Wednesday.startTime.hour', 14]
        },
        {
          $and: [
            {
              $lte: ['$openingTimes.Wednesday.startTime.hour', 14]
            },
            {
              $lte: ['$openingTimes.Wednesday.startTime.minute', 0]
            }
          ]
        }
      ]
    },
    {
      $or: [
        {
         $gt: ['$openingTimes.Wednesday.endTime.hour', 14]
        },
        {
          $and: [
            {
              $gte: ['$openingTimes.Wednesday.endTime.hour', 14]
            },
            {
             $gte: ['$openingTimes.Wednesday.endTime.minute', 0]
            }
          ]
        }
      ]
    }
  ]
  }

但最终结果为 false 我认为 $gte: ['$openingTimes.Wednesday.endTime.hour', 14] 将小时数数组与 14 进行比较,是否有办法根据其轮班指示该地点是否开放。

【问题讨论】:

  • 数据似乎表明它在周三 14:00 关闭。有班次10:00结束,下一班15:00开始。

标签: javascript node.js mongodb mongoose aggregate


【解决方案1】:

您可以尝试以下聚合:

{
  isPlaceOPen: {
    $cond: {
          if: { $gt: [{ $size: {
      $filter: {
        input: '$openingTimes.Wednesday',
        as: 'shift',
        cond: {
          $and: [
            {
              $or: [
                {
                  $lt: [
                    '$$shift.startTime.hour',
                    14
                  ]
                },
                {
                  $and: [
                    {
                      $lte: [
                        '$$shift.startTime.hour',
                        14
                      ]
                    },
                    {
                      $lte: [
                        '$$shift.startTime.minute',
                        0
                      ]
                    }
                  ]
                }
              ]
            },
            {
              $or: [
                {
                  $gt: [
                    '$$shift.endTime.hour',
                    14
                  ]
                },
                {
                  $and: [
                    {
                      $gte: [
                        '$$shift.endTime.hour',
                        14
                      ]
                    },
                    {
                      $gte: [
                        '$$shift.endTime.minute',
                        0
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    } }, 0] },
          then: true,
          else: false,
        },
  }
}

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 2019-05-10
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2017-03-10
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多