【问题标题】:Can MongoDB automatically generate special indexes for geolocation data?MongoDB 可以自动为地理位置数据生成特殊索引吗?
【发布时间】:2012-04-22 19:23:54
【问题描述】:

我目前在 Ruby on Rails 应用程序中有一个 Mongoid 模型:

class Listen
    include Mongoid::Document
    field :song_title, type: String
    field :song_artist, type: String
    field :loc, :type => Array
    field :listened_at, type: Time, default: -> { Time.now }

    index(
        [[:loc, Mongo::GEO2D]], background: true
    )
end

例如,当我尝试查询集合时

listens = Listen.where(:loc => {"$within" => {"$centerSphere" => [location, (radius.fdiv(6371))]}})

返回错误(位置已被空白,未返回 X)

Mongo::OperationFailure (can't find special index: 2d for: { loc: { $within: { $centerSphere: [ [ XX.XXXXXXX, X.XXXXXXX ], 0.0001569612305760477 ] } } }):

我知道我可以通过诸如rake db:mongoid:create_indexes 之类的 rake 任务创建索引,但我不想每次创建模型时都必须这样做。模型有没有办法在插入集合时自动创建它?

【问题讨论】:

  • 模型实例保存到集合后,您应该不需要创建索引。那是你看到的你需要做的吗?应该在定义模型时完成一次。
  • 创建模型后,会创建 BSON ID,但是当我尝试对集合(例如上面列出的集合)运行查询时,它会引发 can't find special index 错误。

标签: ruby-on-rails ruby-on-rails-3 mongodb geolocation mongoid


【解决方案1】:

不,没有办法。

您必须创建一次索引(不仅仅是地理)才能使用它。

【讨论】:

  • 模型是否可以在创建时做到这一点?它创建 BSON ID,但不允许查询位置。感谢您提供信息。
  • 我相信我遇到的问题是因为我时不时会放弃收藏并忘记我必须再次运行rake db:mongoid:create_indexes。运行一次后,我不再收到此错误。
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2023-03-16
  • 2012-06-05
相关资源
最近更新 更多