【问题标题】:mongoid batch updatemongoid 批量更新
【发布时间】:2011-09-12 20:53:41
【问题描述】:

我想每小时更新大量文档。

这里是 相当简单的模型:

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 中,我会将 article_nr 外键到“stock”表,删除整个 stock 表,然后运行“collection.insert”或类似的东西

但这种方法似乎不适用于 mongoid。 有什么提示吗?我无法理解collection.update 并且更改 belongs_to 和 has_one 上的外键似乎不起作用 (试过了,但是 Article.first.stock 是 nil)

但是必须有一种比遍历 stocklist 哈希数组并执行更快的方法 像

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

【问题讨论】:

    标签: ruby-on-rails ruby mongodb mongoid


    【解决方案1】:

    更新中

    您可以使用 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"
     )
    

    现在我可以理解更多了。假设您的文章编号是 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_nr => "123" 的文章 所以你总是可以调用最后的股票。

    my_article.stocks.last
    

    如果您想更精确,请在 Stock 中添加字段 :article_nr,然后 :after_save 使 new_stock.article_id = new_stock.article_nr

    这样您无需进行任何更新,只需创建新库存,它们始终会在插入时被放入正确的文章中,您可以获得最新的文章。

    【讨论】:

    • 是的,我知道,但这并不能解决问题。如果坚持你的例子,我需要更新 90K 个对象,它们都有不同的“last_name”并且都有不同的“first_name”
    • 嗯,也许你应该在 Artile 的存货清单中嵌入。因此,您可以将它们全部放在一个 MongoDocument 中。
    • 现在看看,我认为这对你有用,我更新了答案。
    【解决方案2】:

    如果您可以仅将股票信息提取到单独的集合中(可能在您的文章中具有 has_one 关系),那么您可以使用带有 --upsertFields 选项的 mongoimport,使用 article_nr 作为您的 upsertField。见http://www.mongodb.org/display/DOCS/Import+Export+Tools

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2011-09-11
      • 2019-01-29
      相关资源
      最近更新 更多