0

我是 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...?

4

4 回答 4

0

我不确定您是否正在使用embeds_oneembeds_many在您的问题中互换使用关系名称的单数和复数形式。

如果这是一个embeds_one问题,那么您不应该迭代,@objet.coordonnee因为它是一个文档。您的视图代码应如下所示:

<%= @objet.nom %>
<%= @objet.coordonnee.address1 %>

如果它是 a embeds_many,您的关系名称应该是复数,那么您应该能够t.address1在您的视图中使用。

# model Objet
embeds_many :coordonnees

# view
<%= @objet.nom %>
<% @objet.coordonnees.each do |t|  %>  
  <%= t.address1 %>
<% end %>
于 2013-07-04T00:37:28.307 回答
0

适用于完整文档的代码是什么?它已从您的帖子中删除。

在 mongo Shell 中,您可以使用点表示法执行此操作db.collection.find({},{'coordonnees.adresse1':1,'_id':0})您需要指定'_id':0因为_id默认情况下始终返回。

另一个答案将不起作用,因为adresse1它是一个子文档。您必须包含对 的引用coordonnees

于 2013-07-01T20:44:30.293 回答
0

我找到了解决我的问题的方法。要仅显示哈希的一个元素,我可以这样做:

<%= @objet.coordonnees['adresse1'] %>
于 2013-07-02T17:38:57.307 回答
0

对 MongoID 不是很熟悉,但假设您可以直接调用 mongo,所有类似 find 的语句都有第二个隐式参数,称为 a projection,它指定您想要返回的确切内容。

例如,仅显示adresse1集合中的所有项目:

db.collection.find({},{"coordonnees.adresse1": 1, "_id":0})

应该只返回adresse1参数。我不太能够确切地知道您在什么上下文中显示对象,但不管上下文如何,对 mongo 的 api 调用应该相当简单。如果我误解了这个问题,请告诉我。

在您发布的示例中,您应该将 find 函数更改为如下所示:

Objet.find({params[:id]}, {:fields => [coordonnees.adresse1]})

希望有帮助。

于 2013-07-01T20:41:16.667 回答