2

インデックスに問題があるレールアプリがあります。名前で場所を検索します。最初に、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 })
 ...

なぜ失敗するのか誰にも分かりますか?

4

1 に答える 1

0

インデックスを再作成してみてください。モンゴイドの場合:

rake db:mongoid:create_indexes
于 2012-12-12T17:17:55.640 に答える