私はMongoidをRailsプロジェクト(どちらも4.0.x)で使用しています。スキーマレスのデータを格納するハッシュフィールドを持つドキュメントがあります。この設定でmongoidハッシュフィールドの値を設定する
class Thing
field :name, type: String
field :mass, type: Integer
field :info, type: Hash
end
、私はそうのようなキー:endDate
を持っている、と言う、物事を照会することができます
Thing.where("info.endDate"=>{'$exists'=>true})
そして、それはすべて素晴らしく、便利です。この:info
フィールドのハッシュフィールドを使用するのは、私が保存したいものが固定されたスキーマを持たず、あるものから別のものに変わるので、いいです。
でも、:info
ハッシュの$set
のキーと値のペアと同じドット構文を使用することはできません。 [1]
thing.set("info.endDate"=>Time.now)
Raises a Mongoid::Errors::UnknownAttribute
エラーが発生しました。
これは私のモデルにMongoid::Attributes::Dynamic
を含める必要があることを示していますが、それはが私にはわかりますです。 The point of the hash field typeは、固定スキーマを持たないデータを扱うことができるようです。私はハッシュフィールドを使うために特別な "動的属性"モジュールを含める必要があるようには思えません。
だから、今、私はそうのように、定期的に古い[]
構文を使用して値を更新した後、モデルにsave
を呼んでいる:
thing.info[:endDate] = Time.now
thing.save
しかし、それはよりよいだろうということが起こる多くの時間その値をちょうど$set
にします。ハッシュフィールドの値を設定するための他の構文はありますか?私は上記のエラーメッセージと動的な属性が間違っている間違っている間違っていますか?私は今、ハッシュフィールドの2つのステップの更新をしていますか?
[1]確かに、私は最近mongomapperから移行しました。この構文の私の期待は、これまでmongomapperでこれを行うことができたことによって部分的に設定されています。
私は –
Iドン(このアプローチをテストしたことはありません)属性:: ::ダイナミックをMongoidとして定義されますembeds_oneは、あなたのために働くだろうと思います埋め込み文書が必要です。ハッシュフィールドが必要なのは、そこに格納されているデータがドキュメントごとに異なるからです。そして、mongoidは、そのハッシュ内の特定のキー/値のペアを照会する方法を私に与えます。私は$ setを使って、そのハッシュのキーと値のペアを簡単に更新できるようにしたいと考えています。 – Bee
それは '.set(:info => {:endDate => Time.now})'ではありません '私はMongoDBと一緒に作業して以来、しばらくしてきました。 –