MongoDb聚合比赛日期部分

时间:2015-06-20 19:20:09

标签: mongodb mongodb-query aggregation-framework

我试图做这个查询,基本上得到的所有时间点都是上午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
        }
    }
}
}

1 个答案:

答案 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 } }
])