我正在使用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)
对于当前用户和公司的查询,而不是公司中嵌入的产品。我需要查看产品原始查询以找出该查询的问题。
答案 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支持嵌入式文档的虚拟集合。