MongoDB $addFields,根据条件添加布尔字段

Posted

技术标签:

【中文标题】MongoDB $addFields,根据条件添加布尔字段【英文标题】:MongoDB $addFields, add boolean field based on condition 【发布时间】: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开始。 【参考方案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,
        ,
  

【讨论】:

以上是关于MongoDB $addFields,根据条件添加布尔字段的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate

MongoDB添加字段取决于名称?

$addFields 用于在 Python 中使用 MongoDB 的特定条目

没有找到 $match 时的 $addFields

MongoDB心得

mongoDB在java中怎么根据内嵌文档条件查询