Ruby on rails mongoid批更新

Ruby on rails mongoid批更新,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我想每小时更新一次大量的文档 这是我的建议 相当简单的模型: 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

我想每小时更新一次大量的文档

这是我的建议 相当简单的模型:

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
所以每小时我都会得到一份新的库存清单,其中:stock,:ordered和:eta“可能”已经改变 我需要更新它们

编辑: 存货清单上只包含

:article_nr, :stock, :ordered, :eta
我将其解析为散列

在SQL中,我会采用外键将文章编号键入“stock”表、删除整个stock表并运行“collection.insert”或类似的方法

但这种方法似乎不适用于mongoid。 有什么提示吗?我脑子里想不起来collection.update 而在“属于”和“拥有”上更改外键似乎不起作用 (试过了,但后来Article.first.stock为零)

但是必须有一种比迭代stocklist散列数组并执行以下操作更快的方法 差不多

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

您可以使用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"
 )
现在我能理解多一点了。您可以尝试这样做,假设您的文章nr是uniq

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\u nr=>“123” 所以你可以随时调用最后一支股票

my_article.stocks.last
如果希望更精确,请在库存中添加字段:article\u nr,然后在保存后:创建新库存。article\u id=新库存。article\u nr


这样你就不必做任何更新,只需创建新的股票,它们总是会被放在插入的正确文章中,你就可以得到最新的股票信息。

如果你可以将股票信息提取到一个单独的集合中(也许在你的文章中有一个has_-one关系),然后您可以将mongoimport与--upsertFields选项一起使用,使用article\u nr作为upsertField。看。

是的,我知道,但这并不能解决问题。我需要更新90K个对象,它们都有不同的“姓氏”,都有不同的“名字”,如果坚持你的例子,嗯,也许你应该嵌入Artile的股票列表中。那么你就可以把它们都放在一个MongoDocument中了。现在看看,我想这对你应该有用,我更新了答案。