У меня есть запрос, построенный вокруг составного индекса, и я проверил из оболочки 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 и только обрабатывает ее только в приложении слой ликации. Не идеально!
Вы пытались включить журнал mongod и посмотреть запрос, который mongoid отправляет на сервер? –
какую версию mongod вы используете? похоже, что вы получаете неправильные nscannedObjects, который предлагает более старую, чем текущую версию. –