我是MongoDB和MongoID的真正初学者。 我创建了两个支架
class Objet
include Mongoid::Document
field :nom, type: String
embeds_one :coordonnee
end
并且
class Coordonnee
include Mongoid::Document
field :adresse1, type: String
field :adresse2, type: String
field :code_postal, type: String
field :ville, type: String
embedded_in :objet
end
这就是我在创建新Objet
时所获得的:
现在,我正在尝试仅显示此文档的字段adresse1
,但它不起作用。我只能显示整个嵌入式文档:
当我这样做时:
<%= @objet.coordonnees.adresse1 %>
我收到此错误:
undefined method `adresse1' for #<Hash:0x2b2b1f0>
我该怎么做?
修改
这样做,我可以显示所有元素“Adresse1,adresse2,ville,code_postal”:
Controller
def show
@objet = Objet.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @objet }
end
end
View
<%= @objet.nom %>
<% @objet.coordonnee.each do |t| %>
<%= t[1] %>
<% end %>
但我的问题是:如何只显示其中一个?比如ville,或code_postal或adresse1 ......?
答案 0 :(得分:0)
不太熟悉MongoID,但假设你可以直接调用mongo,所有类似于find的语句都有第二个隐含参数,称为projection
,它指定你想要返回的内容。
例如,仅显示集合中所有项目的adresse1
:
db.collection.find({},{"coordonnees.adresse1": 1, "_id":0})
应仅返回adresse1
参数。我无法确切地告诉您正在显示对象的上下文,但无论上下文如何,api对mongo的调用应该相当简单。如果我误解了这个问题,请告诉我。
在您发布的示例中,您应该将查找功能更改为以下内容:
Objet.find({params[:id]}, {:fields => [coordonnees.adresse1]})
希望有所帮助。
答案 1 :(得分:0)
您的代码适用于完整文档?它已从您的帖子中删除。
在mongo Shell中,您可以使用点符号db.collection.find({},{'coordonnees.adresse1':1,'_id':0})
执行此操作。您需要指定'_id':0
,因为默认情况下始终会返回_id
。
其他答案无效,因为adresse1
是一个子文档。您必须包含对coordonnees
。
答案 2 :(得分:0)
我找到了解决问题的方法。 要只显示哈希的一个元素,我可以这样做:
<%= @objet.coordonnees['adresse1'] %>
答案 3 :(得分:0)
我不确定您是否使用embeds_one
或embeds_many
,因为您在问题中可以互换使用单数和复数形式的关系名称。
如果是embeds_one
,则问题在于您不应该对@objet.coordonnee
进行迭代,因为它是单个文档。您的视图代码应如下所示:
<%= @objet.nom %>
<%= @objet.coordonnee.address1 %>
如果是embeds_many
,您的关系名称应该是复数,那么您应该可以在视图中使用t.address1
。
# model Objet
embeds_many :coordonnees
# view
<%= @objet.nom %>
<% @objet.coordonnees.each do |t| %>
<%= t.address1 %>
<% end %>