插入许多 mongo - 出错时继续 ruby / Ruby Mongo 等效于 mysql 插入忽略
Insert many mongo - continue on error ruby / Ruby Mongo equivalent for mysql insert ignore
你好,当我尝试继续错误插入很多时,它在 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 => false)
PushNotification.collection.insert_many([{:campaign_id => "1",:actor_vid => 9},{:campaign_id => "1",: actor_vid => 10}],:continue_on_error => 真, :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:in
result'
来自 /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:in
bulk_write'
来自 /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:in
insert_many_with_clear_cache'
来自(IRB):133
来自 /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:in
start'
来自 /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:68:in console'
from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in
run_command!'
来自 /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:in
require'
来自 script/rails:6:in `'
或
mongo 与 mysql insert ignore 的等效项是什么?我需要执行 insert_many 操作并在 unique keys
上绕过错误
continue_on_error 不是 insert_many 的选项,请使用 无序插入 instead.By 指定ordered: false ,插入将以无序方式发生,它会尝试插入所有 requests.Including 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
因此,在块执行后,您将插入 4 个新条目和 2 个 Mongo::Error::BulkWriteError
异常。
你好,当我尝试继续错误插入很多时,它在 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 => false)
PushNotification.collection.insert_many([{:campaign_id => "1",:actor_vid => 9},{:campaign_id => "1",: actor_vid => 10}],:continue_on_error => 真, :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:in
result'
来自 /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:in
bulk_write'
来自 /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:in
insert_many_with_clear_cache'
来自(IRB):133
来自 /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:in
start'
来自 /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:68:in console'
from /home/deploy/.bundler/notification_service/ruby/2.2.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in
run_command!'
来自 /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:in
require'
来自 script/rails:6:in `'
或 mongo 与 mysql insert ignore 的等效项是什么?我需要执行 insert_many 操作并在 unique keys
上绕过错误continue_on_error 不是 insert_many 的选项,请使用 无序插入 instead.By 指定ordered: false ,插入将以无序方式发生,它会尝试插入所有 requests.Including 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
因此,在块执行后,您将插入 4 个新条目和 2 个 Mongo::Error::BulkWriteError
异常。