пакетное обновление mongoid - PullRequest
       3

пакетное обновление mongoid

5 голосов
/ 13 сентября 2011

Я бы хотел ежечасно обновлять большой набор документов.

Вот довольно простая модель:

class Article
   include Mongoid::Document
   field :article_nr, :type => Integer
   field :vendor_nr, :type => Integer
   field :description, :type => String
   field :ean
   field :stock
   field :ordered
   field :eta

, поэтому каждый час я получаю новый список акций,где: сток,: заказано и: эта "могла" изменилась, и мне нужно обновить их все.

Редактировать: список содержит только

:article_nr, :stock, :ordered, :eta

, которые я анализирую в хэш

В SQL я бы взял путь к внешнему ключу, введя article_nr в таблицу «stock», отбросив всю таблицу stock и запустив «collection.insert» или что-то подобное

Но этоПодход, кажется, не работает с Mongoid.Есть намеки?я не могу разобраться с collection.update и изменением внешнего ключа для принадлежащих_объектов и has_one, похоже, не работает (пробовал, но тогда Article.first.stock был равен нулю)

Но должен бытьболее быстрый способ, чем перебирать массив хэшей stocklist и делать что-то вроде

Article.where( :article_nr => stocklist['article_nr']).update( stock: stocklist['stock'], eta: stocklist['eta'],orderd: stocklist['ordered'])

Ответы [ 2 ]

10 голосов
/ 20 сентября 2011

ОБНОВЛЕНИЕ

Вы можете атомарно обновить несколько документов в базе данных через критерии, используя Criteria # update_all. Это выполнит атомарный $ set для всех атрибутов, переданных методу.

 # Update all people with last name Oldman with new first name.
 Person.where(last_name: "Oldman").update_all(
first_name: "Pappa Gary"
 )

Теперь я могу понять немного больше. Вы можете попытаться сделать что-то подобное, предполагая, что ваш номер статьи уникален.

class Article
  include Mongoid::Document
  field :article_nr
  field :name
  key :article_nr

  has_many :stocks
end

class Stock
  include Mongoid::Document
  field :article_id
  field :eta
  field :ordered
  belongs_to :article
end

Тогда вы при создании акций:

Stock.create(:article_id => "123", :eta => "200")

Тогда он автоматически получит назначение для статьи с article_nr => "123" Так что вы всегда можете позвонить на последнюю акцию.

my_article.stocks.last

Если вы хотите более точно указать, вы добавляете поле : article_nr на складе, а затем : after_save make new_stock.article_id = new_stock.article_nr

Таким образом, вам не нужно делать никаких обновлений, просто создайте новые акции, и они всегда будут добавлены в нужную статью на вкладке, и вы сможете получить самую последнюю.

0 голосов
/ 25 января 2012

Если вы можете извлечь только информацию об акциях в отдельную коллекцию (возможно, с помощью отношения has_one в вашей статье), то вы можете использовать mongoimport с опцией --upsertFields, используя article_nr в качестве вашего upsertField.Смотри http://www.mongodb.org/display/DOCS/Import+Export+Tools.

...