仅在特定时间内查询MongoDB搜索

时间:2016-06-14 23:47:35

标签: node.js mongodb

我有一个问题,我想按当天的特定时段进行搜索,

让我们开始:

我的数据架构如下所示:

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

我有很多条目,价格的价值每分钟都在变化。

如果我想搜索,比方说,当天的小时数是:9或15,所以结果必须返回所有条目9到9:59和15到15:59

我尝试做类似的事情:

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

但显然,不要工作。

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

我认为您可以使用$ hour,$ day ...来分解聚合日期。 例如:

我的数据:

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 }

Here is the doc

答案 1 :(得分:1)

请参阅下面的mongo shell查询,因为它利用聚合框架的功能与简单的每小时分析:

这将产生以下输出:

{
    "_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])