2013-06-05 4 views
1

Я собираюсь по всему миру искать решение моей проблемы. Я использую Mongoid для записи набора данных в MongoDB.Монгоидная пакетная вставка со сложной схемой?

Я пытаюсь сделать пакетное вставку с Mongoid следующим образом:

class Geonode 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embeds_one :location 
    embeds_one :transport 

end 

class Location 
    include Mongoid::Document 

    field :city,  :type => String 

    embedded_in :geonode 

end 

class Transport 
    include Mongoid::Document 

    embeds_many :trainstation 
    embedded_in :geonode 

end 

class Trainstation 
    include Mongoid::Document 

    field :station, :type => String 

    belongs_to :transport 

end 

И это прекрасно работает, чтобы сделать это один за другим, но если я хочу, чтобы партия их много, то, что я делать?

Я пробовал.

require 'moped' 
require 'rubygems' 
require 'mongo' 
require 'mongoid' 

require 'skySchema.rb' #schema is the file i defined the classes just before 



Mongoid.load!("./mongoid.yml", :development) 

include Mongo 

batch = [] 

batch << {:location => Location.new(:city => "London"), 
      :transport => Transport.new(:trainstation => 
      [Trainstation.new(:station => "Kings Cross")])}} 

and then doing this many many times, after which 

Geonode.collection.insert(batch) 

но это не сработает. Я делаю что-то неправильно?

+0

«не работает» означает что? вы получаете сообщение об ошибке? добавляется только первый? что-то другое? –

+0

Объект не вставлен, он просто падает. И мне интересно, нужно ли мне что-то определять? Ничего не происходит, я получаю следующее сообщение об ошибке: .rvm/gems/ruby-1.9.3-p429/gems/mongoid-3.1.4/lib/mongoid/attributes.rb: 320: in 'method_missing ': undefined method '__bson_dump__ 'для # (NoMethodError) – inquire

+0

какая версия Mongoid это? Драйвер MongoDB не всегда поддерживал синтаксис пакетной вставки, поэтому, возможно, это версия, основанная на старой версии Ruby Driver? –

ответ

1

Проблема в том, что для установки периодического, вам необходимо сделать:

Geonode.insert(batch) 

И форматировать партию по-другому. Теперь все круто. Спасибо за помощь, ребята.

+1

Как вам нужно было отформатировать партию, чтобы она работала? – Rafal

+0

@Rafal, насколько я помню, я сделал что-то вроде ' партии = [] пункта = {// вашего материала здесь} партии << пункт ' , а затем 'YourEntity.create (партия) ' или ' YourEntity.insert (партия) ' Так вы добавите все элементы в массиве, а затем вставить этот массив вещей, и он будет разделить его на группы в зависимости от оборудования и вставить их. Моя скорость вставки составляла около 80 за раз, но это было давно, и я работал на довольно неплохом оборудовании. Сообщите мне, если это поможет. – inquire

+1

Спасибо, на самом деле мне пришлось вызвать as_document для встроенного класса, чтобы он работал с пакетом. пакет << Object.new ({: a => 1,: sub_obj => SubObj.new ({: b => 2}). As_document}). As_document – Rafal

 Смежные вопросы

  • Нет связанных вопросов^_^