Conozca las novedades en:
Para ver una lista de versiones y notas de versión detalladas, consulte Versiones de Mongoid en GitHub.
Novedades en 9.0
La versión 9.0 incluye las siguientes nuevas características, mejoras y correcciones:
Railsmdb
Junto con el lanzamiento de Mongoid v9.0, railsmdb, una utilidad de línea de comandos para crear, actualizar, administrar y mantener aplicaciones Rails, está generalmente disponible.
railsmdb facilita trabajar con MongoDB desde la línea de comandos a través de generadores comunes con los que los desarrolladores de Ruby on Rails ya están familiarizados.
Por ejemplo, puede utilizar railsmdb para generar stubs para nuevos modelos Mongoid:
bin/railsmdb generate model person
Esto creará un nuevo modelo en app/models/person.rb:
class Person include Mongoid::Document include Mongoid::Timestamp end
Puedes especificar los campos del modelo:
bin/railsmdb generate model person name:string birth:date
class Person include Mongoid::Document include Mongoid::Timestamp field :name, type: String field :birth, type: Date end
Puede indicarle al generador que convierta el nuevo modelo en una subclase de otro, pasando la opción --parent:
bin/railsmdb generate model student --parent=person
class Student < Person include Mongoid::Timestamp end
Si necesita almacenar sus modelos en una colección diferente a la que se puede inferir del nombre del modelo, puede especificar --collection:
bin/railsmdb generate model course --collection=classes
class Course include Mongoid::Document include Mongoid::Timestamp store_in collection: 'classes' end
Para obtener más información, consulte el repositorio mongoid-railsmdb en GitHub.
Eliminación del soporte para Ruby 2.6 y JRuby 9.3
Mongoid v9.0 requiere Ruby 2.7 o posterior, o JRuby 9.4. Las versiones anteriores de Ruby y JRuby no son compatibles.
Eliminación del soporte para Rails 5
Mongoid v9.0 requiere Rails 6.0 o posterior. Las versiones anteriores de Rails no son compatibles.
Eliminación de clase obsoleta Mongoid::Errors::InvalidStorageParent
Se ha eliminado la clase obsoleta Mongoid::Errors::InvalidStorageParent.
around_* Se ignoran las devoluciones de llamadas para documentos incrustados
Mongoid v8.x y versiones anteriores permiten al usuario definir devoluciones de llamada around_* para documentos incrustados. A partir de la versión v9.0, estas devoluciones de llamada se ignoran y no se ejecutan. Si se definen, se mostrará una advertencia en la consola.
Si desea restaurar el comportamiento anterior, puede establecer Mongoid.around_embedded_document_callbacks como verdadero en su aplicación.
Nota
No se recomienda habilitar las devoluciones de llamada para documentos incrustados, ya que podría causar around_* SystemStackError excepciones cuando un documento tenga muchos documentos incrustados. Consulte MONGOID-5658 para obtener más información.
for_js El método está obsoleto
El método for_js está obsoleto y se eliminará en Mongoid v10.0.
Eliminación de opciones obsoletas
Cambio importante: Las siguientes opciones de configuración se eliminaron en Mongoid v. Asegúrese de9.0 haber eliminado todas las referencias a estas opciones de su aplicación. Si usaba config.load_defaults 8.1 antes de la actualización, no experimentará ningún cambio de comportamiento. Consulte las notas de versiones anteriores para conocer el significado de cada opción.
:use_activesupport_time_zone:broken_aggregables:broken_alias_handling:broken_and:broken_scoping:broken_updates:compare_time_by_ms:legacy_attributes:legacy_pluck_distinct:legacy_triple_equals:object_id_as_json_oid:overwrite_chained_operators
Además, se ha eliminado el soporte para las versiones config.load_defaults v7.5 y anteriores (debe utilizar como mínimo la versión v8.0).
Eliminación de funcionalidad obsoleta
Cambio importante: se ha eliminado la siguiente funcionalidad obsoleta:
El módulo
Mongoid::QueryCachese ha eliminado. Reemplace cualquier uso 1por1 conMongo::QueryCache. El métodoMongoid::QueryCache#clear_cachedebe reemplazarse porMongo::QueryCache#clear. Todos los demás métodos y submódulos tienen el mismo nombre.Object#blank_criteria?método eliminado (anteriormente obsoleto).Document#as_json :compactla opción se elimina. Llama a`#compacten el objetoHashresultante en su lugar.Se ha eliminado la clase obsoleta
Mongoid::Errors::InvalidStorageParent.
Obtener y establecer variables locales del subproceso
Nuevo en la versión 9.0.3.
Puede usar los métodos Mongoid::Threaded.get y Mongoid::Threaded.set para consultar y modificar variables locales del hilo. Para saber cuándo usar estos métodos, consulte Sección Variables locales de subproceso de la guía de devoluciones de llamadas.
Configuración de verificación de índice
Nuevo en la versión 9.0.7.
Puede usar la Mongoid.allow_duplicate_index_declarations opción de configuración para enviar la verificación del índice al servidor. Si se declara un índice duplicado, el servidor genera un error. Para obtener más información, consulte la sección "Opciones de configuración" de la guía de configuración de la aplicación.
touch El método borra el estado cambiado
En Mongoid v8.x y anteriores, el método touch deja los modelos en el estado modificado:
# v8.x behaviour band = Band.create! band.touch band.changed? # => true band.changes # => {"updated_at"=>[2023-01-30 13:12:57.477191135 UTC, 2023-01-30 13:13:11.482975646 UTC]}
A partir de la versión v9.0, Mongoid ahora borra correctamente el estado modificado después de usar el método touch.
# v9.0 behavior band = Band.create! band.touch band.changed? # => false band.changes # => {}
Modo Sandbox para la consola Rails
Mongoid ahora es compatible con el modo sandbox de la consola Rails. Si la consola Rails se inició con el indicador --sandbox, Mongoid inicia una transacción en el cliente :default antes de abrir la consola. Esta transacción no se confirmará. Por lo tanto, los comandos ejecutados en la consola con el cliente :default no se conservarán en la base de datos.
Nota
Si ejecuta comandos en el modo sandbox utilizando cualquier otro cliente que no sea el predeterminado, estos cambios se conservarán como de costumbre.
Nueva API de transacciones
Mongoid 9.0 presenta una nueva API de transacciones inspirada en Active Record:
Band.transaction do Band.create(title: 'Led Zeppelin') end band = Band.create(title: 'Deep Purple') band.transaction do band.active = false band.save! end
Para obtener más información, consulte la guía Transacciones y sesiones.
Los documentos incrustados siempre utilizan el contexto de persistencia principal
Mongoid v8.x y versiones anteriores permiten especificar el contexto de persistencia de un documento incrustado (mediante la macro store_in). En Mongoid v9.0, estas configuraciones se ignoran para los documentos incrustados. Un documento incrustado ahora siempre usa el contexto de persistencia de su documento principal.
Soporte para pasar valores sin procesar a consultas
Al realizar consultas, ahora es posible omitir la lógica de coerción de tipos de Mongoid mediante la clase contenedora Mongoid::RawValue. Esto puede ser útil cuando los datos heredados de la base de datos son de un tipo diferente al de la definición del campo.
class Person include Mongoid::Document field :age, type: Integer end # Query for the string "42", not the integer 42 Person.where(age: Mongoid::RawValue("42"))
Se genera el AttributeNotLoaded error al acceder a campos omitidos en la proyección de la consulta
Cuando intente acceder a un campo en una instancia del modelo que quedó excluido con los métodos de proyección de only o without al cargarse la instancia, Mongoid producirá ahora un error Mongoid::Errors::AttributeNotLoaded.
Band.only(:name).first.label #=> raises Mongoid::Errors::AttributeNotLoaded Band.without(:label).first.label = 'Sub Pop Records' #=> raises Mongoid::Errors::AttributeNotLoaded
En versiones anteriores de Mongoid, las mismas condiciones generaban un ActiveModel::MissingAttributeError. Revise su código para ver si hay usos específicos de Mongoid para esta clase y cámbielos a Mongoid::Errors::AttributeNotLoaded. Tenga en cuenta que AttributeNotLoaded hereda de Mongoid::Errors::MongoidError, mientras que ActiveModel::MissingAttributeError no.
Utilice la zona horaria configurada Date para Time convertir a en consultas
Al consultar un campo de hora usando un valor de fecha, Mongoid ahora considera correctamente Time.zone para realizar la conversión de tipos.
class Magazine include Mongoid::Document field :published_at, type: Time end Time.zone = 'Asia/Tokyo' Magazine.gte(published_at: Date.parse('2022-09-26')) #=> will return all results on or after Sept 26th, 2022 # at 0:00 in Asia/Tokyo time zone.
En versiones anteriores de Mongoid, el código anterior ignoraba el Time.zone (independientemente de la configuración :use_activesupport_time_zone ahora eliminada) y siempre usaba la zona horaria del sistema para realizar la conversión de tipo.
Tenga en cuenta que en versiones anteriores de Mongoid, la conversión de tipos Date a Time durante las operaciones de persistencia ya utilizaba correctamente la zona horaria.
touch El método en documentos incrustados touch: false maneja correctamente la opción
Cuando la opción touch: false está configurada en una relación embedded_in, llamar al método touch en un documento secundario incrustado no invocará touch en su documento principal.
class Address include Mongoid::Document include Mongoid::Timestamps embedded_in :mall, touch: false end class Mall include Mongoid::Document include Mongoid::Timestamps embeds_many :addresses end mall = Mall.create! address = mall.addresses.create! address.touch #=> updates address.updated_at but not mall.updated_at
Además, el método touch se ha optimizado para realizar una operación de persistencia por documento principal, incluso cuando se utilizan múltiples niveles de documentos incrustados anidados.
embedded_in Asociaciones predeterminadas touch: true
La actualización de un subdocumento incrustado ahora afectará automáticamente al documento principal, a menos que establezca explícitamente touch: false en la relación:
class Address include Mongoid::Document include Mongoid::Timestamps embedded_in :mall, touch: false end
Para todas las demás asociaciones, el valor predeterminado sigue siendo touch: false.
Valor predeterminado invertido para la :replace opción en upsert
Mongoid v8.1 añadió la opción :replace al método upsert. Esta opción se utilizaba para especificar si el documento existente debía actualizarse o reemplazarse.
Mongoid v9.0 cambia el valor predeterminado de esta bandera de true a false. Esto significa que, por defecto, Mongoid v9.0 actualiza el documento existente y no lo reemplaza.
Inmutabilidad del campo _id reforzada
Antes de Mongoid v9.0, modificar el campo _id se comportaba de manera inconsistente dependiendo de si el documento era de nivel superior o incrustado, y según cómo se realizaba la actualización. En v9.0, cambiar el campo _id ahora generará una excepción cuando se guarde el documento, si el documento se había guardado previamente.
Mongoid 9.0 también presenta una nueva característica, immutable_ids, cuyo valor predeterminado es true.
Mongoid::Config.immutable_ids = true
Cuando se establece en false, se restaura el comportamiento anterior e inconsistente.
Compatibilidad con alias de campo en las opciones de índice
Se ha agregado soporte para usar nombres de campos con alias en las siguientes opciones de la macro index: partial_filter_expression, weights, wildcard_projection.
class Person include Mongoid::Document field :a, as: :age index({ age: 1 }, { partial_filter_expression: { age: { '$gte' => 20 } }) end
Nota
La expansión de alias de nombres de campo en opciones de índice como partial_filter_expression se realiza según el comportamiento del servidor MongoDB 6.0. Es posible que futuras versiones del servidor cambien la interpretación de estas opciones, y es posible que la funcionalidad de Mongoid no admita dichos cambios.
Campos BSON 5 BSON::Decimal128 y
Cuando BSON 4 o anterior está presente, cualquier campo declarado como BSON::Decimal128 devolverá un valor BSON::Decimal128. Sin embargo, cuando BSON 5 está presente, cualquier campo declarado como BSON::Decimal128 devolverá un valor BigDecimal por defecto.
class Model include Mongoid::Document field :decimal_field, type: BSON::Decimal128 end # under BSON <= 4 Model.first.decimal_field.class #=> BSON::Decimal128 # under BSON >= 5 Model.first.decimal_field.class #=> BigDecimal
Si necesita valores literales BSON::Decimal128 con BSON 5, puede indicarle a Mongoid que permita campos literales BSON::Decimal128:
Model.first.decimal_field.class #=> BigDecimal Mongoid.allow_bson5_decimal128 = true Model.first.decimal_field.class #=> BSON::Decimal128
Nota
La opción allow_bson5_decimal128 solo tiene efecto en BSON 5 y posteriores. BSON 4 y anteriores ignoran la configuración por completo.
Gestión de índices de búsqueda para MongoDB Atlas
Al conectarse a MongoDB Atlas, Mongoid ahora permite crear y eliminar índices de búsqueda. Puede hacerlo programáticamente mediante la API Mongoid::SearchIndexable:
class SearchablePerson include Mongoid::Document search_index { ... } # define the search index here end # create the declared search indexes; this returns immediately, but the # search indexes may take several minutes before they are available. SearchablePerson.create_search_indexes # query the available search indexes SearchablePerson.search_indexes.each do |index| # ... end # remove all search indexes from the model's collection SearchablePerson.remove_search_indexes
Si no está conectado a MongoDB Atlas, se ignorarán las definiciones de índices de búsqueda. Intentar crear, enumerar o eliminar índices de búsqueda generará un error.
También hay tareas rake disponibles, para mayor comodidad:
# create search indexes for all models; waits for indexes to be created # and shows progress on the terminal. $ rake mongoid:db:create_search_indexes # as above, but returns immediately and lets the indexes be created in the # background $ rake WAIT_FOR_SEARCH_INDEXES=0 mongoid:db:create_search_indexes # removes search indexes from all models $ rake mongoid:db:remove_search_indexes
Eliminación de Time.configured
Time.configured Devolvía el objeto de tiempo que encapsulaba la zona horaria configurada o la clase estándar de Ruby Time. Esto permitía consultar un valor de tiempo incluso sin zona horaria configurada.
Mongoid ahora requiere que se establezca una zona horaria si se desea realizar alguna acción con valores de tiempo (incluido el uso de marcas de tiempo en los documentos). Cualquier uso de Time.configured debe reemplazarse por Time.zone.
# before: puts Time.configured.now # after: puts Time.zone.now # or, better for finding the current Time specifically: puts Time.current
Si no configura una zona horaria, verá errores en su código relacionados con los valores nil. Si usa Rails, la zona horaria predeterminada ya está configurada en UTC. Si no usa Rails, puede configurar una zona horaria al inicio de su programa de la siguiente manera:
Time.zone = 'UTC'
Esto establecerá la zona horaria en UTC. Puede ver todos los nombres de zonas horarias disponibles ejecutando el siguiente comando:
$ ruby -ractive_support/values/time_zone \ -e 'puts ActiveSupport::TimeZone::MAPPING.keys'
Los registros recuerdan la persistencia Contexto de la creación
Considere el siguiente código:
record = Model.with(collection: 'other_collection') { Model.first } record.update(field: 'value')
Antes de Mongoid v9.0, el código anterior fallaba silenciosamente al ejecutar la actualización, ya que el registro no recordaba las opciones de almacenamiento (en este caso, la especificación de una colección alternativa para el modelo). Por lo tanto, el registro se cargaba desde other_collection, pero al actualizarse, intentaba buscar y actualizar el documento en la colección predeterminada del modelo. Para que esto funcionara, habría que especificar la colección explícitamente para cada actualización.
A partir de Mongoid v9.0, los registros que se crean o cargan bajo opciones de almacenamiento explícitas recordarán esas opciones (incluido un cliente nombrado, una base de datos diferente o una colección diferente).
Si necesita el comportamiento heredado (pre-v9.0), puede habilitarlo con el siguiente indicador:
Mongoid.legacy_persistence_context_behavior = true
Esta bandera tiene como valor predeterminado falso en Mongoid v9.0.