javascript - 按时钟范围查询 mongo 文档 - 正向和反向

标签 javascript mongodb mongoose mongodb-query

业务案例:我不想检索那些不想在一天中的某个时间段(例如下类时间)被检索到的用户。

在与此接近的架构上

{
  '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 点。我怎样才能编写一个有助于解决这个问题的查询?今天没有头发可拔。

最佳答案

对于“正常”范围(例如上午 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 分钟内想到它。

关于javascript - 按时钟范围查询 mongo 文档 - 正向和反向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28462931/

相关文章:

javascript - ReactJS URL 查询字符串。浏览器历史记录不起作用

php - Imagick 和 GridFS

json - Mongodb导入错误

node.js - Mongoose 查询以增加项目数组中的字段(如果存在),否则将其添加到文档中(很难表述此标题)

mongodb - 使用 Mongoose 更新双层嵌套数组中的字段

javascript - 响应问题

php - 每次点击图像时 jCarousel 初始化/刷新/重新加载

javascript - 扩展 HTMLButtonElement 时 ES6 无法使用 native setter

javascript - mongo 查询中的多个 $unwind 和 $group

node.js - Mongoose 中多个键的唯一性