Mongodb:基于ISODate格式的查询

假设Mongodb数据库中的示例文档如下所示:

{ "date" : ISODate("2015-11-09T05:58:19.474Z") } { "date" : ISODate("2014-10-25T07:30:00.241Z") } { "date" : ISODate("2015-11-30T15:24:00.251Z") } { "date" : ISODate("2012-01-10T18:36:00.101Z") } 

预期:

  { "date" : ISODate("2015-11-09T05:58:19.474Z") } { "date" : ISODate("2014-10-25T07:30:00.241Z") } 

Iam有兴趣查找在“date”字段中的时间在04:00至08:00之间的文件,无论date,月份和年份如何。 间接查询必须匹配date字段中的任何“YYYY-MM-DDT”。

我的方法是,从节点查询所有文档中的所有文档,然后查询匹配查询的每个文档,比较文档的“date”字段与“yyyy-MM-DDT”+“required_time”(“YYYY-通过使用moment.js模块将MM-DD从每个文档的“date字段”中复制,以便通过转换为moment()并获取月份,date和年份来进行比较。

有没有什么方法可以直接得到相同的结果?

注意:我正在使用nodejs连接到mongodb

一种方法是使用聚合框架 ,特别是根据文档及其子文档中的值剥离内容的文档stream的$redact操作符。 根据布尔expression式的结果,文档可以从stream中剪除,在其子文档已经被检查之后被包括在stream中,或者只是完整地传递到stream中。 $redact背后的想法是从stream中移除敏感信息。

在你的情况下,标准expression式使用$cond运算符和$and布尔运算符来表示时间范围与比较运算符$gt$lt之间的逻辑“与”。 使用$hourdate操作符将date字段的小时数返回为0到23之间的数字。因此,您的最终聚合看起来像这样:

 db.collection.aggregate([ { "$redact": { "$cond": { "if": { "$and": [ { "$gt": [ {"$hour": "$date"}, 4] }, { "$lt": [ {"$hour": "$date"}, 8] } ] }, "then": "$$KEEP", "else": "$$PRUNE" } } } ]) 

示例输出:

 /* 0 */ { "result" : [ { "_id" : ObjectId("56404450472fe25cc6b85886"), "date" : ISODate("2015-11-09T05:58:19.474Z") }, { "_id" : ObjectId("56404450472fe25cc6b85887"), "date" : ISODate("2014-10-25T07:30:00.241Z") } ], "ok" : 1 }