简单模型:
class hat
embedded_in :owner
field :color
end
class owner
embedds_one :hat
referenced_in :house
field :name
end
class house
references_one :owner
field :number
end
简单地说,我们收集了与业主相关的房屋,业主可以戴上彩色帽子。
我可以按照他们的号码对房子进行排序:
House.all.order_by( [[ :number, :asc ]])
但我想要的是按照主人的名义订购房子,理想情况下我想写一下:
House.all.order_by( [[ :'owner.name', :asc ]])
但它不起作用......
更进一步,我希望能够按照主人帽子的颜色对房屋进行分类
House.all.order_by( [[ :'owner.hat.color', :asc ]])
如果可能的话,如果不重写所有内容,我知道如何实现这一目标:)
由于
ALEX
答案 0 :(得分:3)
点符号仅适用于嵌入式文档,但您有2个集合 - 房屋和所有者。 在MongoDB中的一个所有者记录中,您只有字段house_id,在其中一个House记录中,您没有与所有者模型的任何连接。 所以唯一的方法是获取所有的Houses,然后使用Enumerable #sort。对其进行排序。
答案 1 :(得分:2)
这样做的方法是: - 将所有者名称作为字符串嵌入到房屋文档中。 house对象将同时具有owner_id(以便您可以获取完整所有者doc)以及仅使用所有者名称作为字符串的额外字段。 您只需在更改owner_id时更改名称,并且可以在1更新中完成,因此它是一致的。 使用它将是一个非常有效的查询,因为它不需要查看集合和文档的读取。 下行使用了更多的内存。
让所有者对象引用房子,因为所有者“拥有”。 然后,您可以查询按名称排序的所有者,然后获取将以正确顺序获得的参考文档文档。 这有许多个别查询的缺点。
一个极端的解决方案是嵌入所有这些文档:帽子在所有者内部,所有者在屋内。
最好的, AG