如何查询MongoDB上的子元素

时间:2011-01-23 02:31:31

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

how to query child objects in mongodb

非常相似

我有:

Pais(Country)及其子女(总共ufds(27)),我正在将Ruby seed.rb文件制作成文件中的大量插入。

映射文件是:

class Pais
  include Mongoid::Document
  field :nome, :type => String
  field :sigla, :type => String

  embeds_many :ufds
  validates_uniqueness_of :sigla
end

class Ufd
  include Mongoid::Document
  field :codigo_ibge, :type => String
  field :sigla, :type => String
  field :nome, :type => String

  embedded_in :pais, :inverse_of => :ufds
  embeds_many :cidades

  validates_uniqueness_of :codigo_ibge, :sigla
end

class Cidade
  include Mongoid::Document
  field :codigo_ibge, :type => String
  field :nome, :type => String

  embedded_in :ufd, :inverse_of => :cidades
  validates_uniqueness_of :codigo_ibge
end

因此,在导入时,我会做以下其他事情:

pais_base = Pais.create!(:nome => "Brasil", :sigla => "BR")

File.open(caminho + 'estados.txt').each_with_index do |linha, index|
  sigla, nome, ibge = linha.chomp.split("|")
  pais_base.ufds << Ufd.new(:sigla => sigla, :nome => nome, :codigo_ibge => ibge )
end

正确创建PAIS及其UFDS子项,但现在要创建UFDS的子项,我加载另一个文件并尝试查找带有id(codigo_ibge)的UFDS,但始终返回null

File.open(caminho + 'cidades.txt').each_with_index do |linha, index|
  ufd, ibge, nome = linha.chomp.split("|")
  uf = pais_base.ufds.find(:first, :conditions => {:codigo_ibge => ufd.to_s }) <<<<< NIL
  uf.cidades << Cidade.new(:codigo_ibge => ibge.to_s, :nome => nome)
end

我该怎么做?我已经没想到了:/

提前致谢。

1 个答案:

答案 0 :(得分:1)

您使用的是什么版本的mongoid?

我认为你最好的选择是使用

这将使您的查询

  uf = pais_base.ufds.where(:codigo_ibge => ufd.to_s }.first

find只在你查找id时才真正使用。