0

これはとても単純に思えますが、どうやら私は何かが欠けているようです。私は 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" }
4

1 に答える 1

1

デバッグに関する uldall の助け (すばらしい pretty() 手法) のおかげで、自分の問題は、WebSite コレクションに埋め込まれた Domain コレクションではなく、2 つの別個のコレクションが並んでいることにあることに気付きました。これは、「embedded_in」と「embeds_many」を使用して、モデルを設定する方法です。

class WebSite
  include Mongoid::Document
  embeds_many :domains, inverse_of: :web_site
  field :name, type: String
end

class Domain
  include Mongoid::Document
  embedded_in :web_site, inverse_of: :domains
  field :name, type: String
end

これで、ドキュメントは MongoDB コンソールから次のように表示されます。

> db.web_sites.find().pretty()     
{
  "_id" : ObjectId("5148e63f6a3b8b8ffa000001"),
  "domains" : [
    {
      "_id" : ObjectId("5148e6706a3b8b8ffa000002"),
      "name" : "test.com"
    }
  ],
  "name" : "test"
}

そのスキーマでは、これは機能します:

2.0.0p0 :008 > WebSite.where('domains.name' => 'test.com').count
=> 1

[乾杯]

于 2013-03-19T22:31:59.603 に答える