如何使用 mongoid/mongodb 批量更新/更新插入?

Chr*_*sen 4 ruby ruby-on-rails mongodb mongoid

我有一个包含数百万Order文档的数据库。我用以下方法批量插入它们:

Order.collection.insert([
                         {:_id=>BSON::ObjectId('5471944843687229cdfb0000'), :status=>"open", :name=> "Benny"},
                         {:_id=>BSON::ObjectId('5471944843687229cdfc0000'), :status=>"open", :name=> "Allan"}
                        ])
Run Code Online (Sandbox Code Playgroud)

我经常需要更新status订单的属性。使用该方法单独更新它们的效率很低update_attribute

如何批量更新多个 MongoDB 文档?

所需的解决方案可以用下面的“虚构”代码最好地描述:

# IMPORTANT: The exemplified upsert method does not exist

Order.collection.upsert([
                         {:_id=>BSON::ObjectId('5471944843687229cdfb0000'), :status=>"closed"},
                         {:_id=>BSON::ObjectId('5471944843687229cdfc0000'), :status=>"some_other_status"}
                        ])
Run Code Online (Sandbox Code Playgroud)

仅供参考,这篇文章中可能有类似的问题/答案,但老实说我不遵循答案。

Cyr*_*ris 6

所引用问题中的最佳答案可以简化为

id_status = [['5471944843687229cdfb0000','closed'], ...] 

bulk_order = id_status.map do |id, status| # Using array destructuration
  { update_one:
    {
      filter: { _id: id },
      update: { :'$set' => {
        status: status,
      }}
    }
  }
end
YourCollection.collection.bulk_write(bulk_order)
Run Code Online (Sandbox Code Playgroud)