1

イベントベースのアプリケーションに Mongoid で Rails 4 を使用しています。その配列にドキュメントが埋め込まれた配列フィールドを追加するモデルを作成しようとしています。この埋め込みドキュメントには、ユーザーの地理座標とタイムスタンプが含まれます。5 分ごとに、ユーザーの最新の座標をユーザーの (場所) 配列にプッシュします。誰かが私を助けてくれませんか、どうすればそれを作成できますか。

私のサンプルモデルと必要なドキュメントは次のとおりです。

class User
  include Mongoid::Document
  field :name, type: String

  field :locations, type: Array

end

ここで押したい

結果として探しているサンプルドキュメントは次のとおりです。

{ _id : ObjectId(...),
  name : "User_name",
  locations : [ {
                 _id : ObjectID(...),
                 time : "...." ,
                 loc : [ 55.5, 42.3 ]
                } ,
                {
                 _id : ObjectID(...),
                 time : "...",
                 loc : [ -74 , 44.74 ]
                }
              ]
}

IRB を介して埋め込みドキュメントなしで場所配列に値を追加できましたが、後で MongoDB の地理空間クエリを使用するため、2D インデックスと残りの Mongo ドキュメントに記載されているものを使用したいと考えています。したがって、緯度と経度を含むドキュメントの配列が必要だと思います。これにより、コーディングの時間も節約できます。

また、場所の時刻をドキュメント '_id' にすることはできますか? (クエリのオーバーヘッドを減らすのに役立ちます)

誰かが私が書くべきモデルの構造について私を助けてくれるか、参考文献に私を案内してくれるなら、私は本当に感謝しています.

PS: 地理空間データを mongoDB に保存することについて、参考になる情報やヘルプがあれば教えてください。

4

1 に答える 1

1

これが誰かを助けることを願っています。

ドキュメントを埋め込みたい場合はembedded_many、そのような関係を処理する mongoid の機能を使用できます。埋め込みドキュメントにもインデックスを定義できます

http://mongoid.org/en/mongoid/docs/relations.html#embeds_many

Mongoid は、2D インデックスを配列に適用する必要があると指摘しています: http://mongoid.org/en/mongoid/docs/indexing.html

あなたの場合、モデルは次のようになります。

class User
  include Mongoid::Document

  field :name, type: String

  embeds_many :locations

  index({ "locations.loc" => "2d" })

  accepts_nested_attributes_for :locations # see http://mongoid.org/en/mongoid/docs/nested_attributes.html#common
end

class Location
  include Mongoid::Document

  field :time, type: DateTime # see http://mongoid.org/en/mongoid/docs/documents.html#fields
  field :loc, type: Array

  embedded_in :user
end

ただしupdate、ネストされた属性の使用には注意してください。属性の更新のみが許可され、削除または拒否は許可されません。(association)_attributes=代わりにメソッドを使用することをお勧めします。

@user = User.new({ name: 'John Doe' })
@user.locations_attributes = {
  "0" => {
   _id : ObjectID(...),
   time : "...." ,
   loc : [ 55.5, 42.3 ]
  } ,
  "1" => {
   _id : ObjectID(...),
   time : "...",
   loc : [ -74 , 44.74 ]
  }
}
@user.save!
于 2015-01-17T10:00:51.167 に答える