これはとても単純に思えますが、どうやら私は何かが欠けているようです。私は WebSite モデルを持っています:
class WebSite
include Mongoid::Document
has_many :domains, inverse_of: :web_site
field :name, type: String
end
WebSite モデルには、ドメインの配列が埋め込まれています。
class Domain
include Mongoid::Document
belongs_to :web_site, inverse_of: :domains
field :name, type: String
end
私がやろうとしているのは、「test.com」のドメインを持つ Web サイトを見つけることだけです。私が試したものは、Mongoid でも MongoDB コンソールでも機能しないようです。たとえば、「test.com」という名前の 1 つのドメインを持つ 1 つの Web サイトがあるとします。
2.0.0p0 :001 > WebSite.count
=> 1
2.0.0p0 :002 > WebSite.first.domains
=> [#<Domain _id: 5148d9b76a3b8b1fe6000003, web_site_id: "5148d9a96a3b8b1fe6000002", name: "test.com">]
...では、これでうまくいくのではないでしょうか?
2.0.0p0 :003 > WebSite.elem_match(domains: { name: "test.com" }).count
=> 0
2.0.0p0 :004 > WebSite.elem_match('domains' => { 'name' => "test.com" }).count
=> 0
私はゼロになります。私は1つを取得する必要があります。
また、O'Reilly の本から、これは機能するはずだという印象を受けました。
2.0.0p0 :005 > WebSite.where('domains.name' => "test.com").count
=> 0
...any_in と同じ:
.0.0p0 :006 > WebSite.any_in('domains' => { 'name' => "test.com" }).count
=> 0
また、MongoDB コンソールから同じクエリを試してみましたが、同じ結果が得られました。
> db.web_sites.find({"domains" : {"$elemMatch" : {"name" : "test.com"}}}).size();
0
> db.web_sites.find({"domains.name" : "test.com"}).size();
0
> db.web_sites.find({"domains" : {$in : {"name" : "test.com"}}}).size();
0
私は何かが欠けている必要がありますか?
アップデート:
以下は、MongoDB コンソールからのスキーマに関する詳細情報です。
> db.web_sites.find().pretty()
{ "_id" : ObjectId("5148d9a96a3b8b1fe6000002"), "name" : "test" }