【问题标题】:Querying mongo documents by clock range - forward and reverse按时钟范围查询mongo文档-正向和反向
【发布时间】:2015-04-12 07:55:56
【问题描述】:

业务案例:我不想检索不想在一天中的某个时间范围内被检索到的用户,例如下班时间。

在接近此的架构上

{
  'name': String,
  'from': Number, // 800 (8:00 AM)
  'to': Number, // 1700 (5:00 PM)
  ...
}

我使用聚合来获取用户,同时在其他操作中展开子文档数组。基本搜索条件在$match 运算符中,如下所示。

User.aggregate([
  {
    // some aggregation stuff
  },
  {
    $match: {
      $and: [
        { 'from': { $lte: currentTime },
        { 'to': { $gte: currentTime }
      ]
    }
  }
]);

问题: 如何允许用户设置反向范围?比如晚上 8 点到早上 8 点。我如何编写一个有助于解决此问题的查询?今天没有头发可以拉。

【问题讨论】:

    标签: javascript mongodb mongoose mongodb-query


    【解决方案1】:

    对于像上午 9 点到下午 5 点这样的“正常”范围,查询条件是

    { "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } }
    

    $and 是不必要的,因为它是隐含的)而对于像晚上 8 点到早上 8 点这样的“反向”范围,查询条件是

    { "$match" : { "$or" : [{ "from" : { "$gte" : ct } }, { "to" : { "$lte" : ct } }] } }
    

    两种范围的逻辑不同,所以你应该为反向范围添加新的字段:

    {
        "name" : "Jerry",
        "rfrom" : 2000,
        "rto" : 800
    }
    

    然后进行聚合,匹配

    { "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } }
    
    { "$match" : { "$or" : [{ "rfrom" : { "$gte" : ct } }, { "rto" : { "$lte" : ct } }] } }
    

    或两个$match条件分离的聚合:

    { "$match" : { "$or" : [
        { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } },
        { "$or" : [{ "rfrom" : { "$gte" : ct } }, { "rto" : { "$lte" : ct } }] }
    ] } }
    

    或者,可能存在一种聪明的方法来存储您的时间范围,该方法适用于一个查询中的“正常”和“反向”范围,但我无法在 5 分钟内想到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多