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