如何在特定日期间隔内查找

Posted

技术标签:

【中文标题】如何在特定日期间隔内查找【英文标题】:How to find in specific date interval 【发布时间】:2020-09-18 21:34:21 【问题描述】:

我在 Mongodb 中找不到想要的文档和列表字段的片段。所以我有以下文件:


  "_id": "5ed38e5d2a6e74567c7a579c",
  "id": "AAA",
  "events": [

  "dayTypeId": "5e71e1918ee9a326ebdf1611",
  "startDate": 
    "$date": "2020-06-01T00:00:00.000Z"
  ,
  "endDate": 
    "$date": "2020-06-04T00:00:00.000Z"
  ,
  "stared": false,
  "userId": "XXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
,

  "dayTypeId": "5e71e1918ee9a326ebdf1611",
  "startDate": 
    "$date": "2020-06-10T00:00:00.000Z"
  ,
  "endDate": 
    "$date": "2020-06-10T00:00:00.000Z"
  ,
  "stared": false,
  "userId": "XXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
,

  "dayTypeId": "5e71d8628ee9a326e7df160d",
  "startDate": 
    "$date": "2020-06-05T00:00:00.000Z"
  ,
  "endDate": 
    "$date": "2020-06-09T00:00:00.000Z"
  ,
  "stared": false,
  "userId": "XXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
    ,

  "dayTypeId": "5e71d8628ee9a326e7df160d",
  "startDate": 
    "$date": "2020-07-13T00:00:00.000Z"
  ,
  "endDate": 
    "$date": "2020-07-21T00:00:00.000Z"
  ,
  "stared": false,
  "userId": "XXXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
    
  ]

我想获取startDateendDate02.06.2020-11.06.2020 范围内的“事件”列表片段。

例如,在我的示例数据中,我希望返回除最后一个元素之外的所有元素。

【问题讨论】:

范围区间的目标是哪个字段:startDateendDate?还是两者兼而有之? 两者。开始日期:2020 年 6 月 2 日,结束日期:2020 年 6 月 11 日。我使用了 $gte 和 $lte 但我没有得到正确的结果。 所以...你的范围区间必须覆盖开始和结束,这意味着 interval_start 是 gte startDate 而 interval_end 是 lte endDate? 【参考方案1】:

您可以使用$filter 过滤掉任何不符合您条件的事件:

db.collection.aggregate([
    
        $match: 
            $or: [
                
                    "events.startDate": $gte: new Date("2020-06-02"), $lte: new Date("2020-06-11")
                ,
                
                    "events.endDate": $gte: new Date("2020-06-02"), $lte: new Date("2020-06-11")
                
            ]
        
    ,
    
        $project: 
           events: 
               $filter: 
                   input: "$events",
                   as: "event",
                   cond: 
                       $or: [
                           
                               $and: [
                                   $gte: ["$$event.startDate", new Date("2020-06-02")],
                                   $lte: ["$$event.startDate", new Date("2020-06-11")],
                               ]
                           ,
                           
                               $and: [
                                   $gte: ["$$event.endDate", new Date("2020-06-02")],
                                   $lte: ["$$event.endDate", new Date("2020-06-11")],
                               ]
                           
                       ]
                   
               
            
        
    
])

【讨论】:

我的朋友,由于“startDate”和“endDate”位于“events”列表中,此代码无法正常工作。请考虑。 啊,您希望它们在所有文档中匹配吗?是否需要保留文档结构。 我只需要包含所需元素的事件列表。是的,我想检查事件列表中的所有元素 我的朋友你有什么发现吗? 我编辑了答案以使用 $filter,因为事件在数组中。

以上是关于如何在特定日期间隔内查找的主要内容,如果未能解决你的问题,请参考以下文章

如何根据关键和时间间隔有效地查找父记录?

如何以特定间隔解析D3上的日期

范围连接 data.frames - R 中具有日期范围/间隔的特定日期列

在日期范围内按日期聚合数据,结果集中没有日期间隔

DateTimePicker - 如何将时间间隔设置为 20 分钟、一周中允许的特定日期和一天中的时间?

Mysql查询检索帖子并根据特定日期间隔进行过滤