用mongodb查询两次

时间:2017-05-11 08:46:59

标签: mongodb

首先,对不起,如果我的问题很明显,但我在使用mongodb进行特定查询时遇到了一些麻烦。

假设我有一个包含以下文件的集合:

+----+--------+---------------------+
| ID |  user  |     record_date     |
+----+--------+---------------------+
|  1 | Frank  | 2017-05-10 12:13:15 |
|  2 | Ian    | 2017-05-10 13:15:18 |
|  3 | Ian    | 2017-05-10 17:45:34 |
|  4 | Lip    | 2017-05-10 18:53:12 |
|  5 | Frank  | 2017-05-10 18:54:23 |
|  6 | Fiona  | 2017-05-10 20:12:48 |
|  7 | Debbie | 2017-05-11 05:05:12 |
|  8 | Ian    | 2017-05-11 08:17:38 |
|  9 | Debbie | 2017-05-11 08:30:57 |
| 10 | Carl   | 2017-05-11 14:17:18 |
+----+--------+---------------------+

我试图获取在时间间隔而不是日期间隔之间具有record_date的任何文档:例如,record_date时间在17:00到19:00之间的所有文档。

使用postgres或mysql,这有点简单:我将日期值转换为数字(ex为第一个文档:1213)和一个简单的查询,如record_date BETWEEN(1700,1900),但我有使用mongo获得相同结果的麻烦。

有人有想法做这样的请求吗?

非常感谢!

吉姆

2 个答案:

答案 0 :(得分:0)

db.times.aggregate([{"$project": {time : {"$dateToString": {format : "%H", 
date : "$record_date"}}}}, {"$match" : {time: {"$gte":"17","$lte":"19"}}}])

此聚合管道在项目阶段使用$ dateToString聚合运算符取出时间部分(特别是使用格式“%H”的小时部分),然后使用匹配阶段过滤结果。 参考 - $dateToString

如果您需要了解有关聚合管道如何工作的更多信息 - Aggregation Pipeline

答案 1 :(得分:0)

试试这个:

db.record.aggregate([
    {
      $match:{
         $and: [
          {
            record_date: {
              $gte: "2017-05-10 17:00:00",
            },
          },
          {
            record_date: {
              $lte: "2017-05-10 19:59:59",
            },
          },
        ]
      }
    }
    ])