Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何通过在嵌入式文档数组中查找匹配项来查找文档?_Mongodb_Mongoid - Fatal编程技术网

Mongodb 如何通过在嵌入式文档数组中查找匹配项来查找文档?

Mongodb 如何通过在嵌入式文档数组中查找匹配项来查找文档?,mongodb,mongoid,Mongodb,Mongoid,这看起来很简单,但显然我遗漏了一些东西。我有一个网站模型: 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

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

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”的网站和一个域:

我得零分。我应该买一个

我还从O'Reilly的书中得到了这样一个印象,这应该是可行的:

2.0.0p0 :005 > WebSite.where('domains.name' => "test.com").count
 => 0
…与以下各项中的任何_相同:

.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" }
> db.web_sites.find().pretty()     
{
  "_id" : ObjectId("5148e63f6a3b8b8ffa000001"),
  "domains" : [
    {
      "_id" : ObjectId("5148e6706a3b8b8ffa000002"),
      "name" : "test.com"
    }
  ],
  "name" : "test"
}

多亏了uldall在调试方面的帮助(这项很棒的pretty()技术),我意识到我的问题在于我有两个并列的独立集合,而不是在我的网站集合中嵌入一个域集合。这就是我的模型应该如何建立的,“嵌入”和“嵌入很多”:

现在,该文档在MongoDB控制台中显示如下:

> db.web_sites.find().pretty()
{ "_id" : ObjectId("5148d9a96a3b8b1fe6000002"), "name" : "test" }
> 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

[欢呼声]

请发布
db.web\u sites.find().pretty()
的结果,以便更好地了解您的数据结构。好的,我用这些信息更新了问题。感谢您查看此文档。您正在搜索一个包含名为“domains.name”且值为“test.com”的属性的文档,但很明显,该属性不存在,因此不会返回任何结果。当我看到pretty()的输出时,我就是这么想的。(我不知道那个非常有用的调试技巧,谢谢!)我只是不明白为什么Mongoid会返回WebSite.first.domains的数组。我一定是误会了Mongoid的事哦!哦!我有两个独立的集合,而不是嵌入的集合。非常感谢你为我指明了正确的方向。
2.0.0p0 :008 > WebSite.where('domains.name' => 'test.com').count
=> 1