仅在特定时间内查询MongoDBsearch

我有一个问题,我想按一天中的特定时间进行search,

开始吧:

我的数据模式如下所示:

{ "symbol": "Orange", "timestamp": ISODate("2016-05-01T20:00:00.000Z"), "price": 10 } 

我有很多的参赛作品,价格的变化的价值分钟。

如果我想search,比方说,当天的小时数是9或15,那么结果必须返回所有的9到9:59和15到15:59

我尝试做一些事情:

  { $match: { timestamp: { $hour: { $in: [array_hours] } } } 

但显然,不工作。

有任何想法吗?

我想你可以使用$小时,$天…来分解聚合中的date。 例如:

我的资料:

 db.orders.find() { "_id" : ObjectId("5760bf21b05d6825e05fa23d"), "item" : "test1", "create_at" : ISODate("2016-04-30T11:00:00Z") } { "_id" : ObjectId("5760bf30b05d6825e05fa23e"), "item" : "test2", "create_at" : ISODate("2016-04-30T12:00:00Z") } { "_id" : ObjectId("5760bf37b05d6825e05fa23f"), "item" : "test3", "create_at" : ISODate("2016-04-30T13:00:00Z") } 

我的查询:

 db.orders.aggregate([{$project:{hour:{$hour:"$create_at"}}}, {$match:{hour:{"$in":[11,12]}}}]) { "_id" : ObjectId("5760bf21b05d6825e05fa23d"), "hour" : 11 } { "_id" : ObjectId("5760bf30b05d6825e05fa23e"), "hour" : 12 } 

这是文档

请参阅下面的mongo shell查询,因为它利用聚合框架的强大function,以每小时简单的分析方式:

这将产生以下输出:

 { "_id" : { "year" : 2016, "month" : 5, "day" : 1, "hour" : 20 }, "avgPrice" : 10.5, "min" : 10.0, "max" : 11.0, "firstEntryValue" : 10.0, "lastEntrValue" : 11.0, "allEntries" : [ { "timestamp" : ISODate("2016-05-01T20:00:00.000Z"), "value" : 10.0, "_id" : ObjectId("57610dce41bcea24b9792443") }, { "timestamp" : ISODate("2016-05-01T20:01:00.000Z"), "value" : 11.0, "_id" : ObjectId("57610dd641bcea24b9792444") }, { "timestamp" : ISODate("2016-05-01T20:01:03.000Z"), "value" : 10.0, "_id" : ObjectId("57610dde41bcea24b9792445") }, { "timestamp" : ISODate("2016-05-01T20:01:05.000Z"), "value" : 11.0, "_id" : ObjectId("57610de341bcea24b9792446") } ] } 

查询示例

 var projectTime = { $project : { _id : 1, symbol : 1, price : 1, timestamp : 1, // now we need to add year/month/day/hour // having this field as separate ones will help us to have diffrent groupping options year : { $year : "$timestamp" }, month : { $month : "$timestamp" }, day : { $dayOfMonth : "$timestamp" }, hour : { $hour : "$timestamp" }, } } var group = { $group : { _id : { year : "$year", month : "$month", day : "$day", hour : "$hour" }, avgPrice : { $avg : "$price" }, min : { $min : "$price" }, max : { $max : "$price" }, firstEntryValue : { $first : "$price" }, lastEntrValue : { $last : "$price" }, allEntries : { $push : { timestamp : "$timestamp", value : "$price", _id : "$_id" } }, } } db.casy.aggregate([projectTime, group])