0

这看起来很简单,但显然我错过了一些东西。我有一个网站模型:

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

网站模型有一个嵌入的域数组:

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

我要做的就是找到一个域为“test.com”的网站。无论是使用 Mongoid 还是使用 MongoDB 控制台,我尝试过的任何方法似乎都不起作用。例如,如果我有一个网站,一个域,名称为“test.com”:

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 

我得零。我应该得到一个。

我还从 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() 技术)我意识到我的问题是我有两个并排的单独集合,而不是嵌入在我的网站集合中的域集合。这就是我的模型应该设置的方式,使用“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 回答