在mongodb中的计数声明

时间:2014-10-20 11:37:14

标签: mongodb mongodb-query spring-data-mongodb mongodb-java

我有以下mysql语句,但我想将它与spring mongodb驱动程序一起用于java。如何转换呢?看过汇总但却不知道怎么做。

SELECT SUM(CASE WHEN CreatedTime BETWEEN ('7:00:00' AND '7:14:59') THEN 1 ELSE 0) as firstCount,
       SUM(CASE WHEN CreatedTime BETWEEN ('7:15:00' AND '7:29:59') THEN 1 ELSE 0) as secondCount,
FROM MyTable
Where username='Jim'

Mongo文件:

{ _id: ObjectId("5asd3ea3402984ca53"), username: "Jim", comment: "hi", CreatedTime: ISODate("2014-10-15T16:39:26.870Z") }

UPDATE 使用弹簧数据将其翻译为java:

致电getTemplate().executeCommand(match);时,我明白了:

{ "serverUsed" : "xxxxxxx" , "ok" : 0.0 , "errmsg" : "no such cmd: $match" , "bad cmd" : { 
"$match" : { "username" : "Jim"} , 
"$group" : {
    "firstCount" : { 
        "$sum" : { 
            "$cond" : { 
                "if" : { 
                    "$and" : [ [ { "$gte" : { "$CreatedTime" : { "$date" : "2014-09-20T16:02:10.924Z"}}} , 1 , 0] , 
                            [ { "$lte" : { "$CreatedTime" : { "$date": "2014-10-20T15:48:19.744Z"}}} , 1 , 0]]} , 
                "then" : { "$ifTrue" : 1} , 
                "else" : { "$else" : 0}
            }
        }
    }
}}}

我用来获取JSON的代码是here(它很长)。查看与@Wizard建议的相同

$ match会有什么问题?我在Stackoverflow的某个地方看到旧版本的mongodb不支持$ match但是我有2014年8月发布,所以情况不是这样。

1 个答案:

答案 0 :(得分:2)

像这样:

db.MyTable.aggregate([{
    $match : {
        username : 'Jim'
    }
}, {
    $group : {
        _id : 0,
        firstCount : {
            $sum : {
                $cond : {
                    "if" : {
                        $and : [{
                            $gte : [ "$CreateTime", '7:00:00' ]
                        }, {
                            $lte : [ "$CreateTime", '7:14:59' ]
                        }]
                    },
                    "then" : 1,
                    "else" : 0
                }
            }
        },
        secondCount : {
            $sum : {
                $cond : {
                    "if" : {
                        $and : [{
                            $gte : [ "$CreateTime", '7:15:00' ]
                        }, {
                            $lte : [ "$CreateTime", '7:29:59' ]
                        }]
                    },
                    "then" : 1,
                    "else" : 0
                }
            }
        },
    }
}]);