Mongodb Mongoid嵌入文档为查询返回空

Mongodb Mongoid嵌入文档为查询返回空,mongodb,ruby-on-rails-3.2,mongoid,Mongodb,Ruby On Rails 3.2,Mongoid,当我查询嵌入模型时,尽管有大量包含嵌入模型实例的父记录,但没有返回任何记录 有两种型号,一个标签嵌入在带中: class Band include Mongoid::Document embeds_one :label end class Label include Mongoid::Document field :name, type: String embedded_in :band end 我可以查询Band(Band.all,Band.find等),但当我查询La

当我查询嵌入模型时,尽管有大量包含嵌入模型实例的父记录,但没有返回任何记录

有两种型号,一个
标签
嵌入在
带中

class Band
  include Mongoid::Document
  embeds_one :label
end

class Label
  include Mongoid::Document
  field :name, type: String
  embedded_in :band
end
我可以查询Band(
Band.all
Band.find
等),但当我查询Label时,它不会返回任何结果。例如:

我使用嵌入标签创建标注栏,并将其保存:

 > b = Band.create
 => #<Band _id: 516cff525543d8842e000008, _type: nil>
 > b.build_label name: "new label"
 => #<Label _id: 516cff5a5543d8842e000009, _type: nil, name: "new label">
 > b.save
 => true
我几乎可以肯定这不是故意的行为。代码直接来自Mongoid文档中的一个示例:


我缺少什么?

我认为您应该使用has\u many,has\u one,bellings\u方法,使您可以像Label.count一样运行查询


当您将文档嵌入到另一个文档中时,它将成为文档的一部分(序列化属性)。如果要选择标签,应首先查找标注栏,然后检查标签属性。它肯定会起作用。

在mongo中,您的查询始终以集合为目标,即可能嵌入其他文档的完整文档。对于mongo来说,它只是一个大的JSON/BSON文档。现在,
Label.all
Label.all
相当于查询
Label
集合。由于标签不存储在
Label
集合中,因此这些查询不会返回任何结果。但是,您仍然可以通过调用

Band.where(:'labels._id' => "516cff5a5543d8842e000009")
或者类似的

Band.where(:'labels.name' => "rock")

如果您希望获得具有特定标签的所有条带,则这是很好的。然而,以这种方式获取所有标签非常昂贵,不推荐使用。你的主要用例是什么?如果它是显示一个乐队的标签或获得带有某个标签的乐队,那么嵌入是很好的。否则,您可以使用关系(has_many/belishing_to)或完全非规范化,即在带内同时将标签保存在单独的集合中(导致冗余数据)。

确定吗?这似乎很不直观,因为这不是默认行为,即使对于嵌入式文档也是如此。感谢您的明确解释。我没有特定的用例,我只是注意到了它,并认为这是一种奇怪的行为——当您对嵌入式Mongoid模型进行查询时,Mongoid是否至少应该发出警告?@SherwinYu,您是对的,它是不直观的,即使它是可以理解的。不幸的是,Mongoid的许多(不常见)角落都是这样,所以要小心:)
Band.where(:'labels._id' => "516cff5a5543d8842e000009")
Band.where(:'labels.name' => "rock")