插入许多 mongo - 继续出错 ruby​​ / Ruby Mongo 等效于 mysql 插入忽略

Gau*_*jan 0 mongodb mongoid ruby-on-rails-3

嗨,当我尝试继续出错以插入许多它在 mongoid 中不起作用时。

我设置了以下唯一索引

db.push_notifications.createIndex({ actor_vid: 1,campaign_id: 1 },{ unique: true, partialFilterExpression: { campaign_id: { $exists: true } } })

PushNotification.collection.insert_many([{:campaign_id => "1",:actor_vid => 9},{:campaign_id => "1",:actor_vid => 8}],:continue_on_error => true,:safe =>错误的)

PushNotification.collection.insert_many([{:campaign_id => "1",:actor_vid => 9},{:campaign_id => "1",:actor_vid => 10}],:continue_on_error => true,:safe =>假)抛出

Mongo::Error::BulkWriteError: Mongo::Error::BulkWriteError 来自 /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/bulk_write/result.rb: 184:in validate!' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/bulk_write/result_combiner.rb:73:inresult' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/bulk_write.rb:65:in execute' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/collection.rb:385:inbulk_write' from /home/deploy/。 bundler/notification_service/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/collection.rb:363:in insert_many' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/mongoid-5.1.3/lib/mongoid/query_cache.rb:168:ininsert_many_with_clear_cache' from (irb):133 from /home/deploy/.bundler/notification_service/ruby/ 2.2.0/gems/railties-4.2.6/lib/rails/commands/console.rb:110:in start' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands/console.rb:9:instart' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2。 6/lib/rails/commands/commands_tasks.rb:68:inconsole' from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in运行命令!来自 /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands.rb:17:in <top (required)>' from script/rails:6:inrequire' from script/rails:6:in `'

mysql insert ignoremongo等价物是什么?我需要在唯一键上绕过错误来执行 insert_many 操作

Sat*_*ish 6

continue_on_error不是 insert_many 的一个选项,而是使用无序插入。通过指定ordered: false,插入将以无序方式发生,它会尝试插入所有请求。包括一个try catch块将确保它不会在一个例外,因此您正在实现 MYSQL INSERT IGNORE 等效项。如果您使用 ROR,这就是您的代码应该是这样的,

begin
 PushNotification.collection.insert_many([{:campaign_id => "1",:actor_vid => 10},{:campaign_id => "1",:actor_vid => 11},{:campaign_id => "1",:actor_vid => 12}],{:ordered => false}) 
 PushNotification.collection.insert_many([{:campaign_id => "1",:actor_vid => 10},{:campaign_id => "1",:actor_vid => 11},{:campaign_id => "1",:actor_vid => 13}],{:ordered => false}) 
resque => ex 
 puts ex.message 
end
Run Code Online (Sandbox Code Playgroud)

因此,在执行块后,您将插入 4 个新条目和 2 个Mongo::Error::BulkWriteError异常。