2013-07-11 2 views
0

У меня есть запрос, построенный вокруг составного индекса, и я проверил из оболочки mongo, что этот запрос может выполняться как запрос только для индекса.Невозможно выполнить закрытый запрос (indexOnly) с помощью mongoid

Выход:

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"} 

Я подозреваю, что это из-за единственным() модификатором. Или это ошибка?

EDIT: Я использую Mongoid v3.1.4 и mongod v2.2

Вот запрос, который mongod видит из Mongoid: Пн июл 15 10:47:26 [conn14] runQuery называется spl_development .merchants {$ query: {st: {$ regex: "cr", $ options: "i"}}, $ explain: true} Пн июл 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 nurrurned: 1 reslen: 393 0ms

Так что проекция не отправляется на слой mongod и только обрабатывает ее только в приложении слой ликации. Не идеально!

+1

Вы пытались включить журнал mongod и посмотреть запрос, который mongoid отправляет на сервер? –

+0

какую версию mongod вы используете? похоже, что вы получаете неправильные nscannedObjects, который предлагает более старую, чем текущую версию. –

ответ

2

Я не уверен, что только фактически устанавливает проекцию при отправке запроса в MongoDB. Если вы проверите журнал (после того, как вы установили регистрацию достаточно высоко, чтобы показать все запросы), вы должны увидеть, какой запрос был отправлен, включая «проецирование». Это покажет вам, действительно ли Mongoid отправляет его, или просто интерпретирует только «только» на прикладном уровне.

0

Сравните запрос, отправленный MongoDB в журналы с тем же запросом, не вызывая explain. On MongoDB 2.2/Mongoid 3.1.4 Я вижу правильный запрос, отправленный в БД. Ищите директиву fields= в журналах Moped.