我有一个问题,我想按当天的特定时段进行搜索,
让我们开始:
我的数据架构如下所示:
{
"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] } } }
但显然,不要工作。
有什么想法吗?
答案 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 }
答案 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])