1

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

有两种模型,一个Label嵌入在 a 中Band

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等),但是当我查询 Label 时,它什么也不返回。Band.find例如:

我创建带有嵌入标签的乐队,并保存它:

 > 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

然后我查询 Band 模型,一切都很好:

 > Band.all.to_a
 => [#<Band _id: 516cff525543d8842e000008, _type: nil>]
 > Band.count
 => 1
 > Band.first.label
 => #<Label _id: 516cff5a5543d8842e000009, _type: nil, name: "new label">
 > Band.find "516cff525543d8842e000008"
 => #<Band _id: 516cff525543d8842e000008, _type: nil>

但是当我查询 Label 模型时,什么也没有出现!

 > Label.all.to_a
 => []
 > Label.count
 => 0
 > Label.last
 => nil
 > Label.first
 => nil
 > Label.find "516cff5a5543d8842e000009" # this is the label id from Band
 => nil

我几乎可以肯定这不是预期的行为。代码直接来自 Mongoid 文档的示例:http: //mongoid.org/en/mongoid/docs/relations.html#embeds_one

我错过了什么?

4

2 回答 2

2

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

Band.where(:'labels._id' => "516cff5a5543d8842e000009")

或类似的东西

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

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

于 2013-07-23T09:23:26.387 回答
0

我认为您应该使用 has_many、has_one、belongs_to 方法来使您可以根据需要运行查询,例如 Label.count。

当您将文档嵌入到另一个文档中时,它将成为文档的一部分(序列化属性)。如果要选择标签,首先应该找到 Band,然后检查标签属性。它绝对应该有效。

于 2013-04-16T07:55:01.050 回答