如何拦截和记录mongodb查询?

时间:2015-06-16 08:12:13

标签: mongodb grails gmongo

如何获取从gmongo驱动程序发送到mongod的确切查询(用于调试目的)。

mysql 中,通过向数据源添加logSql = true来实现。

我正在编写一个聚合查询,其中包含开始日期和结束日期之间的匹配管道。日期以普通的Java Date类给出。

db.collection.aggregate(
            [
                $match:
                    [
                        dateIssued: [

                            $gte: fromDate,

                            $lte: toDate
                        ]
                    ]
            ], 
            [
                $group:
                    [
                        _id: "\$type", 
                        total: 
                            [
                                $sum: 1
                            ]
                    ]
            ])

它似乎不会根据日期过滤结果。它给了我一切。

2 个答案:

答案 0 :(得分:0)

没有办法从驱动程序执行此操作,我发现最好的方法是使用mongosniff。见http://docs.mongodb.org/manual/reference/program/mongosniff/

答案 1 :(得分:0)

  

如何获取从gmongo驱动程序发送到mongod的确切查询(用于调试目的)?

启用mongodb profiling,您可以log all your queries

  

在mysql中,通过将logSql = true添加到datasource来实现。

我认为您希望根据Grails中的配置自动执行此操作。然后,执行以下操作:

Config.groovy

mongo.profiling.enabled = true 

Bootstrap.groovy

GMongo mongo = new GMongo(grailsApplication.config.grails.mongo.host, grailsApplication.config.grails.mongo.port)
DB db = mongo.getDB(grailsApplication.config.grails.mongo.databaseName)

if( grailsApplication.config.grails.mongo.username ) {
    boolean auth = db.authenticate(grailsApplication.config.grails.mongo.username ,
            grailsApplication.config.grails.mongo.password ? grailsApplication.config.grails.mongo.password.toCharArray() : "" )

    if( !auth ) {
        log.error( "MongoDB failed to authenticate")
        return
    }
}

if( grailsApplication.config.mongo.profiling.enabled ) {
    db.setProfilingLevel(2)

}
else {
    db.setProfilingLevel(0)
}