【问题标题】:Batch insert/update using Mongoid?使用 Mongoid 批量插入/更新?
【发布时间】:2011-04-15 21:38:56
【问题描述】:

我用谷歌搜索了所有其他人,但没有找到答案。问题是:

您好,如何使用 Mongoid 批量插入 MongoDB?

【问题讨论】:

    标签: mongodb mongoid


    【解决方案1】:

    您可以使用 ruby​​ mongo 驱动程序的 insert 方法插入一批哈希数组。在任何 Mongoid 类中,您都可以调用 collection 来访问它。

    batch = [{:name => "mongodb"}, {:name => "mongoid"}]  
    Article.collection.insert(batch)
    

    【讨论】:

    • 要记住的重要一点是,通过这样做,您绕过了 mongoid.yml 选项。因此,如果您使用它,请务必在需要时通知他们,例如:Article.with(safe: true).collection.insert(batch)
    • 我收到 NoMethodError: undefined method `insert'
    • 我也是。问了一个关于它的问题stackoverflow.com/questions/33894132/…
    • 对于undefined method 'insert',使用create尝试下面的答案
    • @HarisKrajina - 在 mongoid 的更新版本中,您将需要使用 'insert_many' 方法。希望这会有所帮助,
    【解决方案2】:

    如果您想批量插入 Mongoid 文档(模型)而不是哈希,请在将其放入数组之前调用模型的 as_document 方法:

    @page_views << page_view.as_document
    

    ...

    PageView.collection.insert(@page_views)
    

    【讨论】:

    • 我得到这个错误 undefined method `as_document' for #<0x10a40f870>
    • &amp;
    【解决方案3】:

    Mongoid 的Model.create 方法可以接受一个数组来创建文档。

    来自 Mongoid 文档:

    Person.create([
      { first_name: "Heinrich", last_name: "Heine" },
      { first_name: "Willy", last_name: "Brandt" }
    ])
    

    https://docs.mongodb.org/ecosystem/tutorial/mongoid-persistence/

    【讨论】:

    • 那仍然会一一创建它们:(
    【解决方案4】:

    你可以用这个:

    books = [{:name => "Harry Potter"}, {:name => "Night"}]  
    Book.collection.insert_many(books)
    

    我发现“插入”对我不起作用(Monogoid 5.1.3):

    NoMethodError: undefined method `insert' for # <Mongo::Collection:0x007fbdbc9b1cd0>
    Did you mean?  insert_one
                   insert_many
                   inspect
    

    这是来自“lib/mongo/collection.rb”的源代码:

    # Insert the provided documents into the collection.
    #
    # @example Insert documents into the collection.
    #   collection.insert_many([{ name: 'test' }])
    #
    # @param [ Array<Hash> ] documents The documents to insert.
    # @param [ Hash ] options The insert options.
    #
    # @return [ Result ] The database response wrapper.
    #
    # @since 2.0.0
    def insert_many(documents, options = {})
      inserts = documents.map{ |doc| { :insert_one => doc }}
      bulk_write(inserts, options)
    end
    

    【讨论】:

    • 当我们使用 document.collection.insert_many 时,它会跳过 after_save 回调。如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2020-12-01
    • 2020-12-13
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多