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议你设置一个单独的文档属性,只包含“时间”值,并直接查询,而不是在每次通过计算。