如何实时查看MongoDB原始查询?

时间:2014-04-08 17:39:39

标签: mongodb mongoid

我正在使用Mongoid,但它提供的查询日志非常抽象,它远离ActiveRecord,它可以很好地显示原始SQL查询。我还检查了mongodb日志文件,并显示如下查询:

query stock_system.companies query: { $query: { _id: ObjectId('53398f796a756e0e98040000') }, $orderby: { _id: 1 } } ntoreturn:1 idhack:1 keyUpdates:0 locks(micros) r:40 reslen:2022 0ms

但它仍然是抽象的,不会在嵌套文档中显示查询

我很难调试查询。我尝试使用配置文件级别2启动mongod,将slowms设置为-1。但它没有用,有什么提示吗?

#####编辑:登录嵌套文档查询示例:

我正在尝试在产品嵌套模型中进行搜索,如下所示:

current_user.company.products.where({name: /\A#{params[:name]}/}).limit(5)

根本没有记录该查询。它显示的是:

Processing by AjaxController#products as JSON
  Parameters: {"name"=>"meu", "page"=>"1", "_"=>"1397053974337"}
  MOPED: 127.0.0.1:27017 QUERY        database=stock_system collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('532a31376a756e29c9000000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.5320ms
  MOPED: 127.0.0.1:27017 QUERY        database=stock_system collection=companies selector={"$query"=>{"_id"=>BSON::ObjectId('532a31376a756e29c9020000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.8050ms
Completed 200 OK in 4ms (Views: 0.2ms)

对于当前用户和公司的查询,而不是公司中嵌入的产品。我需要查看产品原始查询以找出该查询的问题。

2 个答案:

答案 0 :(得分:1)

确保您正确设置了性能分析级别。应该是db.setProfilingLevel(2)来记录所有活动。回应应该是这样的:{"是" :0,"慢速" :100," ok" :1}

完成后,您应该能够在数据库中查询system.profile集合,以获取所有活动的日志 - db.system.profile.find()

http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

答案 1 :(得分:0)

真正的问题是Mongoid会触发公司文档的数据库查询,但不会触发嵌入其中的产品。

如果我进行如下查询:

current_user.company.products.where({name: /\A#{params[:name]}/})

将从数据库中查询作为根文档的公司,但产品正则表达式查询将从直接内存搜索执行,而不是像我期望的那样执行数据库查询。因此,产品搜索中没有日志,在这种情况下,产品中的所有索引都将无用。

如果要触发数据库查询以在嵌入文档字段中使用索引,请使用:

Company.where("products.name" =>  /\A#{params[:name]}/)

这是在数据库查询中获取特定产品的方法,直到MongoDB支持嵌入式文档的虚拟集合。