2013-07-11 22 views
0

我有一個基於組合索引構建的查詢,並且我已經從mongo shell驗證此查詢可以作爲僅索引查詢運行。無法使用mongoid執行覆蓋(indexOnly)查詢

輸出:

db.merchants.find({st:{"$regex" : "cr", "$options": "i"}}, {n:1, _id:1}) 
{ "n" : "Crab shack", "_id" : ObjectId("51c908cc1925f3ca51000001") } 
{ "n" : "Tacos R Us", "_id" : ObjectId("51c16f201925f3df4300001b") } 
db.merchants.find({st:{"$regex" : "cr", "$options": "i"}}, {n:1, _id:1}).explain() 
{ 
    "cursor" : "BtreeCursor st_1_n_1__id_1 multi", 
    "isMultiKey" : false, 
    "n" : 2, 
    "nscannedObjects" : 2, 
    "nscanned" : 2, 
    "nscannedObjectsAllPlans" : 2, 
    "nscannedAllPlans" : 2, 
    "scanAndOrder" : false, 
    "indexOnly" : true, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "st" : [ 
      [ 
       "", 
       { 

       } 
      ], 
      [ 
       /cr/i, 
       /cr/i 
      ] 
     ], 
     "n" : [ 
      [ 
       { 
        "$minElement" : 1 
       }, 
       { 
        "$maxElement" : 1 
       } 
      ] 
     ], 
     "_id" : [ 
      [ 
       { 
        "$minElement" : 1 
       }, 
       { 
        "$maxElement" : 1 
       } 
      ] 
     ] 
    }, 
    "server" : "MacBook-Pro.local:27017" 
} 

但是從使用mongoid軌道控制檯運行的同一查詢給我:

Merchant.where({:st => { '$regex'=> "cr", '$options' => 'i' } }).only(:_id, :n).explain 
=> { 
    "cursor"=>"BtreeCursor st_1_n_1__id_1 multi", 
    "isMultiKey"=>false, 
    "n"=>2, 
    "nscannedObjects"=>2, 
    "nscanned"=>2, 
    "nscannedObjectsAllPlans"=>2, 
    "nscannedAllPlans"=>2, 
    "scanAndOrder"=>false, 
    "indexOnly"=>false, 
    "nYields"=>0, 
    "nChunkSkips"=>0, 
    "millis"=>0, 
    "indexBounds"=>{ 
     "st"=>[["", {}], [/cr/i, /cr/i]], 
     "n"=>[[{"$minElement"=>1}, {"$maxElement"=>1}]], "_id"=>[[{"$minElement"=>1}, {"$maxElement"=>1}]] 
    }, 
    "allPlans"=>[{"cursor"=>"BtreeCursor st_1_n_1__id_1 multi", "n"=>2, "nscannedObjects"=>2, "nscanned"=>2, "index 
Bounds"=>{"st"=>[["", {}], [/cr/i, /cr/i]], "n"=>[[{"$minElement"=>1}, {"$maxElement"=>1}]], "_id"=>[[{"$minElement"=>1}, {"$maxElement"=>1}]]}}], "oldPlan"=>{"cursor"=>"Btr 
eeCursor st_1_n_1__id_1 multi", "indexBounds"=>{"st"=>[["", {}], [/cr/i, /cr/i]], "n"=>[[{"$minElement"=>1}, {"$maxElement"=>1}]], "_id"=>[[{"$minElement"=>1}, {"$maxElement 
"=>1}]]}}, "server"=>"Arvinds-MacBook-Pro.local:27017"} 

我懷疑這是因爲只有()改性劑。或者這是一個錯誤?

編輯: 我使用Mongoid v3.1.4和mongod的V2.2

這裏是mongod的查詢從mongoid看到: 週一7月15日10時47分26秒[conn14] runQuery稱爲spl_development .merchants {$ query:{st:{$ regex:「cr」,$ options:「i」}},$ explain:true} Mon Jul 15 10:47:26 [conn14] query spl_development.merchants query:{ $ query:{st:{$ regex:「cr」,$ options:「i」}},$ explain:true} ntoreturn:0 keyUpdates:0 locks(micros)r:212 nreturned:1 reslen:393 0ms

所以投影沒有被髮送到mongod層,只在應用程序中處理它層。不理想!

+1

您是否嘗試啓用mongod日誌並查看mongoid發送給服務器的查詢? –

+0

你使用的是什麼版本的mongod?看起來像你得到不正確的nscannedObjects,這表明比當前版本更舊。 –

回答

2

我不確定是否只有在向MongoDB發送查詢時實際設置了投影。如果您檢查日誌(在設置日誌足夠高以顯示所有查詢之後),您應該看到實際發送了哪個查詢,包括「投影」。這會告訴你Mongoid是否實際發送它,或者只是在應用層中解釋「only」。

0

將在日誌中發送到MongoDB的查詢與相同的查詢進行比較,但不呼叫explain。在MongoDB 2.2/Mongoid 3.1.4上,我看到發送給數據庫的正確查詢。在Moped日誌中查找fields=指令。