cómo manejar el error de duplicado E11000 de mongodb en ruby

¿Hay algún buen ejemplo de manejo de excepciones relacionadas con mongodb en ruby? En este caso tengo:

/home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/networking.rb:89:in `send_message_with_gle': 11000: E11000 duplicate key error index: somedb.somecoll.$_id_ dup key: { : "some_id" } (Mongo::OperationFailure) from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/collection.rb:1108:in `block in insert_documents' from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/util/logging.rb:33:in `block in instrument' from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/util/logging.rb:65:in `instrument' from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/util/logging.rb:32:in `instrument' from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/collection.rb:1106:in `insert_documents' from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/collection.rb:375:in `insert' from lib/tasks/getorders.rb:47:in `block in ' from lib/tasks/getorders.rb:25:in `each' from lib/tasks/getorders.rb:25:in `' 

Estoy teniendo este error porque estoy tratando de insertar un documento con el ID que ya existe en la base de datos mongodb, solo quiero saber cómo manejar las excepciones relacionadas con mongodb en ruby. Por ejemplo, si se produce una excepción, cambiaría el id del hash y luego volvería a intentar insertarlo.

¿Cómo se vería el bloque de rescate ?

El bloque de Ruby se vería algo así como:

 begin # your operation rescue Mongo::OperationFailure => e if e.message =~ /^11000/ puts "Duplicate key error #{$!}" # do something to recover from duplicate else raise e end end # the rest of the exceptions follow .. # if you just care about the dup error # then ignore them #rescue Mongo::MongoRubyError # #Mongo::ConnectionError, Mongo::ConnectionTimeoutError, Mongo::GridError, Mongo::InvalidSortValueError, Mongo::MongoArgumentError, Mongo::NodeWithTagsNotFound # puts "Ruby Error : #{$!}" #rescue Mongo::MongoDBError # # Mongo::AuthenticationError, Mongo::ConnectionFailure, Mongo::InvalidOperation, Mongo::OperationFailure # puts "DB Error : #{$!}" #rescue Mongo::OperationTimeout # puts "Socket operation timeout Error : #{$!}" #rescue Mongo::InvalidNSName # puts "invalid collection or database Error : #{$!}" #end 

Pero, si está actualizando un registro que ya existe, ¿por qué no usa una inserción adicional ?

Si está creando un nuevo registro, ¿por qué no permite que mongod cree el _id?

También se puede utilizar escribir preocupaciones.

@mongo_client.save({:doc => 'foo'}, {:w => 0}) # writes are not acknowledged

Sin embargo, esto no es tan bueno como el rescate.

Si su controlador ruby ​​es >= 2.0.0 , debe usar la clase Mongo::Error para la mayoría de las excepciones relacionadas con mongodb. Aquí es cómo debe verse su bloque de rescue :

 begin # Document insert code rescue Mongo::Error => e if e.message.include? 'E11000' # Change the id of the hash & re-try to insert it end end 
    Intereting Posts