使用MongoID仅显示嵌入文档中的一个字段

时间:2013-07-01 20:35:45

标签: ruby-on-rails-3 mongodb mongoid

我是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时所获得的:

Objet document

现在,我正在尝试仅显示此文档的字段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 ......?

4 个答案:

答案 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_oneembeds_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 %>