我试图做这个查询,基本上得到的所有时间点都是上午9点到9点59分:
db.DataPoints.find({$where: "new Date(this.Head.Timestamp).getHours() === 9"}, {_id: 0, 'Body.PAC.Values.1': 1})
但作为聚合查询。你不能在匹配中的位置
db.DataPoints.aggregate([{ $match : { "Head.Timestamp": { $hour: 9 } } },...
不起作用。到目前为止搜索没有产生任何结果。
编辑:示例文档如下:
{
"_id" : "d5c75619-fe17-4618-9333-004e3ee67cb3",
"Head" : {
"Timestamp" : ISODate("2015-05-20T04:20:00.000Z"),
"RequestArguments" : {
"Query" : "Inverter",
"Scope" : "System"
},
"Status" : {
"Code" : 0,
"Reason" : "",
"UserMessage" : ""
}
},
"Body" : {
"PAC" : {
"Unit" : "W",
"Values" : {
"1" : 55
}
},
"DAY_ENERGY" : {
"Unit" : "Wh",
"Values" : {
"1" : 24
}
},
"YEAR_ENERGY" : {
"Unit" : "Wh",
"Values" : {
"1" : 55017
}
},
"TOTAL_ENERGY" : {
"Unit" : "Wh",
"Values" : {
"1" : 119228
}
}
}
}
答案 0 :(得分:3)
更好的方法是使用 $redact
管道,比使用 $project
更好的逻辑条件然后使用$match
来过滤该逻辑匹配。它将使用$$KEEP
返回符合条件的所有文档,并使用$$PRUNE
变量丢弃那些不匹配的文档:
db.DataPoints.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$eq": [
{ "$hour" : "$Head.Timestamp" },
9
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
更长的方法是使用 $project
运算符创建一个新字段,该运算符存储您可以在下一个$match
管道中使用的小时值:
db.DataPoints.aggregate([
{
"$project" : {
"hour" : { "$hour" : "$Head.Timestamp" },
"Head": 1,
"Body": 1
}
},
{ "$match": { "hour": 9 } }
])