mongo 仅在每个元素都符合条件时才查找

Posted

技术标签:

【中文标题】mongo 仅在每个元素都符合条件时才查找【英文标题】:mongo find only if every element match the condition 【发布时间】:2019-10-18 05:29:43 【问题描述】:

我想通过传递开始日期和结束日期来查找给定时间段内可用的每个房间,在这两个测试之一中至少失败一次的每个集合都需要从查找查询中完全排除.

目前看来,如果至少有一个集合成功匹配这些条件之一,它就会返回给我。

这里是一个集合的样本

"resa": [
    
        "_id": "5cf2a38372373620263c84f1",
        "start": "2019-06-01T15:23:00.000Z",
        "end": "2019-06-01T16:23:00.000Z"
    ,
    
        "_id": "5cf2a3a772373620263c84f2",
        "start": "2022-03-05T16:23:00.000Z",
        "end": "2022-03-05T17:23:00.000Z"
    
]

这是我目前的尝试

$or: [
         resa:  $all: [ $elemMatch:  start:  $lt : req.query.start , end:  $lt : req.query.start    ] ,
         resa:  $all: [ $elemMatch:  start:  $gt : req.query.end , end:  $gt : req.query.end    ] 
      ],

源自 Mickl 的答案,我已经尝试过,但它没有显示任何结果

  Post.find( 
      capacity:  $gte : req.query.capacity ,
      $expr: 
        $allElementsTrue: 
            $map: 
                input: "$resa",
                in: 
                    $or: [
                      
                        $and: [
                           $gte: [ "$$this.start", req.query.end ] ,
                           $gte: [ "$$this.end", req.query.end ] 
                        ]
                      ,
                      
                        $and: [
                           $te: [ "$$this.start", req.query.start ] ,
                           $lte: [ "$$this.end", req.query.start ] 
                        ]
                      ,
                       resa: [] ,
                  ]
                
            
        
    
    ,

我还尝试通过查找不匹配条件的集合来反转查询,这意味着它们在给定时间段内不可用

      resa: 
        $elemMatch:  
          $not:  
            $or: [
              
                $and: [
                 start:  $gte : req.query.start ,
                 start:  $lte : req.query.end  ]
              ,
              
                $and: [
                   end:  $lte : req.query.end ,
                   end:  $gte : req.query.start  ]
              ,
            ],
          ,
        ,
      ,

【问题讨论】:

【参考方案1】:

我设法找到了解决方案:

      resa: 
        $not: 
          $elemMatch: 
            $or: [
              
                $and: [
                 start:  $gte : req.query.start ,
                 start:  $lte : req.query.end  ]
              ,
              
                $and: [
                   end:  $gte : req.query.start ,
                   end:  $lte : req.query.end  ]
              ,
              
                $and: [
                   start:  $gte : req.query.start ,
                   end:  $lte : req.query.end  ]
              ,
              
                $and: [
                   start:  $lte : req.query.start ,
                   end:  $gte : req.query.end  ]
              ,
            ],
          ,
        ,
      ,

要理解的重要部分是组装

      resa: 
        $not: 
          $elemMatch: 
            $or: [
              
                $and: [
                   x: y,
                   x: y ]
              ,
              
                $and: [
                   x: y,
                   x: y ]
              ,
...

意思有点混乱:“我想找到所有匹配this and this的集合 那个那个”

【讨论】:

以上是关于mongo 仅在每个元素都符合条件时才查找的主要内容,如果未能解决你的问题,请参考以下文章

数组元素查找方法对比

数组元素查找方法对比

关于js查找和筛选的几种方式

Groovy集合遍历 ( 使用集合的 findAll 方法查找集合中符合匹配条件的所有元素 | 代码示例 )

Groovy集合遍历 ( 使用集合的 findAll 方法查找集合中符合匹配条件的所有元素 | 代码示例 )

day01704. 二分查找,35.搜索插入位置 ,27. 移除元素