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
之间的逻辑“与”。 使用$hour
date操作符将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 }