インデックスに問題があるレールアプリがあります。名前で場所を検索します。最初に、addresses.coords に問題があると考えましたが、よくわかりません。
検索コントローラーの関連部分:
@practices = Practice.published
@practices = @practices.where(:"addresses.country" => params[:country].upcase) if params[:country].present?
if params[:location].present? && latlng = get_coordinates
@practices = @practices.near_sphere(:"addresses.coords" => latlng).max_distance(:"addresses.coords" => get_distance )
end
# now find doctors based on resulting practices
@doctors = Doctor.published.in("organization_relations.practice_id" => @practices.distinct(:_id))
完全なクラッシュ ログ:
Moped::Errors::OperationFailure (The operation: #<Moped::Protocol::Command
@length=255
@request_id=646
@response_to=0
@op_code=2004
@flags=[]
@full_collection_name="um-contacts.$cmd"
@skip=0
@limit=-1
@selector={:distinct=>"practices", :key=>"_id", :query=>{"deleted_at"=>nil, "published_at"=>{"$lte"=>2012-11-05 15:17:14 UTC}, "addresses.country"=>"DE", "addresses.coords"=>{"$nearSphere"=>[13.4060912, 52.519171], "$maxDistance"=>0.01569612305760477}}}
@fields=nil>
failed with error 13038: "exception: can't find special index: 2d for: { deleted_at: null, published_at: { $lte: new Date(1352128634313) }, addresses.country: \"DE\", addresses.coords: { $nearSphere: [ 13.4060912, 52.519171 ], $maxDistance: 0.01569612305760477 } }"
See https://github.com/mongodb/mongo/blob/master/docs/errors.md
for details about this error.):
app/controllers/search_controller.rb:16:in `index'
これはインデックスの結果です。has_many を介して埋め込まれたアドレスからインデックスをクエリする方法がわかりません。
> db.practices.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "um-contacts.practices",
"name" : "_id_"
}
]
助けていただければ幸いです。
編集:addresses.coordsのインデックスが作成されていないように見えますが、
db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "um-contacts.users", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "um-contacts.doctors", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "um-contacts.collaborations", "name" : "_i
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "um-contacts.practices", "name" : "_id_" }
ただし、練習クラス内で作成する必要があります。
class Practice
...
embeds_many :addresses, cascade_callbacks: true, as: :addressable
...
field :name, type: String
field :kind, type: String
field :slug, type: String
index({"addresses.coords" => '2d'}, { min: -180, max: 180, background: true })
index({name: 1})
index({slug: 1}, { unique: true })
...
なぜ失敗するのか誰にも分かりますか?