Mongodb:在指定的时间之间获取文档,而不考虑date

假设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:15和07:40之间的文件,而不pipedate,月份和年份。 间接查询必须匹配date字段中的任何“YYYY-MM-DDT”。

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

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

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

这个问题是基于Mongodb:基于ISODate格式的查询 。

这里的基本情况是用math来计算分钟。 注意到你已经对匹配的基本原理有了一个答案,但是在“分钟”部分看起来有点麻烦:

 db.collection.aggregate([ { "$redact": { "$cond": { "if": { "$and": [ { "$gte": [ { "$add": [ { "$hour": "$date" }, { "$divide": [{ "$minute": "$date" }, 60] } ]}, 4 + (15/60) ]}, { "$lte": [ { "$add": [ { "$hour": "$date" }, { "$divide": [{ "$minute": "$date" }, 60] } ]}, 7 + (40/60) ]} ] }, "then": "$$KEEP", "else": "$$PRUNE" } }} ]) 

因此,当$add $minute的除数$add$hour则会得到一个介于0-24之间的表示,但是有一个小数分量。

或者直接使用datemath,并清理与$let重复:

 db.collection.aggregate([ { "$redact": { "$cond": { "if": { "$let": { "vars": { "hours": { "$divide": [ { "$mod": [ { "$subtract": [ "$date", new Date(0) ] }, 1000 * 60 * 60 * 24 ]}, 1000 * 60 * 60 ] } }, "in": { "$and": [ { "$gte": [ "$$hours", 4 + (15/60) ] }, { "$lte": [ "$$hours", 7 + (40/60) ] } ] } } }, "then": "$$KEEP", "else": "$$PRUNE" } }} ]) 

无论哪种方式,它只是解决部分组件,并将其添加到select的值。

如果你真的想定期查询这个,我强烈build议你设置一个单独的文档属性,只包含“时间”值,并直接查询,而不是在每次通过计算。