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中了。现在看看,我想这对你应该有用,我更新了答案。