Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Notas de versión

Conozca las novedades en:

  • Versión 9.0.7

  • Versión 9.0

Para ver una lista de lanzamientos y notas de versión detalladas, consulta Mongoid Lanzamientos en GitHub.

Advertencia

Cambios radicales

La versión 9.0.7 incluye cambios incompatibles.

La versión 9.0.7 incluye los siguientes cambios:

  • Una versión anterior de Mongoid corrigió un error que impedía que las funciones de devolución de llamada de los procesos secundarios que dependían del estado del proceso principal se ejecutaran si el proceso secundario no había cambiado. Dado que esta corrección introdujo una disminución del rendimiento, esta versión de parche restaura la funcionalidad anterior. Ahora, las funciones de devolución de llamada de los procesos secundarios solo se ejecutan si el proceso secundario ha cambiado. Esto supone un cambio incompatible con las aplicaciones que dependen de que las funciones de devolución de llamada se ejecuten en procesos secundarios sin modificar (por ejemplo, cuando una función de devolución de llamada de un proceso secundario depende de que el proceso principal haya cambiado de estado).

    El siguiente ejemplo de código muestra cómo invocar devoluciones de llamada de hijos en respuesta a cambios en los padres:

    class Parent
    include Mongoid::Document
    has_many :children
    after_save { children.each(&:parent_changed_callback) }
    end
    class Child
    include Mongoid::Document
    belongs_to :parent
    def parent_changed_callback
    # ...
    end
    end

La versión 9.0 incluye las siguientes nuevas funcionalidades, mejoras y correcciones:

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, puedes usar railsmdb para generar stubs para nuevos modelos de 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

Puedes indicar 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 necesitas almacenar tus modelos en una colección diferente a la que se pueda inferir del nombre del modelo, puedes especificar --collection:

bin/railsmdb generate model course --collection=classes
class Course
include Mongoid::Document
include Mongoid::Timestamp
store_in collection: 'classes'
end

Para más información, consulta el repositorio mongoid-railsmdb en GitHub.

Mongoid v9.0 requiere Ruby 2.7 o posterior, o JRuby 9.4. Las versiones anteriores de Ruby y JRuby no son compatibles.

Mongoid v9.0 requiere Rails 6.0 o una versión más reciente. No se admiten versiones anteriores de Rails.

La clase obsoleta Mongoid::Errors::InvalidStorageParent ha sido eliminada.

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 antiguo, puede configurar Mongoid.around_embedded_document_callbacks como verdadero en su aplicación.

Nota

Habilitar las around_* funciones de retorno para documentos incrustados no es recomendado, ya que puede causar excepciones SystemStackError cuando un documento tiene muchos documentos incrustados. Consulta MONGOID-5658 para obtener más detalles.

El método for_js está obsoleto y se eliminará en Mongoid v10.0.

Cambio disruptivo: Las siguientes opciones de configuración se eliminan en Mongoid v9.0. Por favor, asegúrate de eliminar todas las referencias a estos elementos de tu aplicación. Si estabas utilizando config.load_defaults 8.1 antes de la actualización, no experimentarás ningún cambio de comportamiento. Consulte las notas de versión anteriores para entender 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 descartado el soporte para config.load_defaults versiones v7.5 y anteriores (se debe usar al menos la versión v8.0).

Cambio importante: se ha eliminado la siguiente funcionalidad obsoleta:

  • El módulo Mongoid::QueryCache ha sido eliminado. Por favor, reemplace cualquier uso de 1-por-1 por Mongo::QueryCache. El método Mongoid::QueryCache#clear_cache debería ser reemplazado por Mongo::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 :compact la opción se elimina. Llama a `#compact en el objeto Hash resultante en su lugar.

  • La clase obsoleta Mongoid::Errors::InvalidStorageParent ha sido eliminada.

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 aprender cuándo usar estos métodos, vea el Sección Variables locales de subproceso de la guía de devoluciones de llamadas.

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.

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 v9.0, Mongoid ahora borra correctamente el estado de cambio después de usar el método touch.

# v9.0 behavior
band = Band.create!
band.touch
band.changed? # => false
band.changes # => {}

Mongoid ahora soporta modo sandbox para la consola de Rails. Si la consola Rails se inició con la bandera --sandbox, Mongoid inicia una transacción en el cliente :default antes de abrir la consola. Esta transacción no será confirmada. Por lo tanto, todos los comandos ejecutados en la consola usando el cliente :default no se guardarán en la base de datos.

Nota

Si ejecutas comandos en el modo sandbox utilizando cualquier otro cliente que no sea el por defecto, estos cambios se persistirán como de costumbre.

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.

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.

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"))

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.

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.

Cuando se activa la opción touch: false en una relación de tipo embedded_in, llamar al método touch en un documento hijo incrustado no activará touch en su documento padre.

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 ha sido optimizado para realizar una operación de persistencia por documento padre, incluso al usar múltiples niveles de documentos incrustados anidados.

Actualizar un subdocumento embebido ahora modificará automáticamente el padre, a menos que establezcas 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 por defecto sigue siendo touch: false.

Mongoid v8.1 se añadió la opción :replace al método upsert. Esta opción se utilizó para especificar si el documento existente debía actualizarse o reemplazarse.

Mongoid v9.0 revierte el valor por defecto de este indicador de true a false. Esto significa que, por defecto, Mongoid v9.0 actualiza el documento existente y no lo reemplaza.

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 introduce una nueva funcionalidad de banderas, immutable_ids, que por defecto está en true.

Mongoid::Config.immutable_ids = true

Cuando se establece en false, se restaura el comportamiento más antiguo y poco consistente.

Se ha agregado soporte para el uso de 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.

Cuando BSON 4 o anteriores están presentes, cualquier campo declarado como BSON::Decimal128 devolverá un valor de 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 indicar 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 bajo BSON 5 y posteriores. El BSON 4 y las versiones anteriores ignoran por completo la configuración.

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ás conectado a MongoDB Atlas, las definiciones de los índices de búsqueda se omiten. Al intentar crear, enumerar o remover índices de búsqueda, se producirá 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

Time.configured devolvió el objeto de tiempo que envolvía la zona horaria configurada o la clase estándar Time de Ruby. Esto permitía query un valor de tiempo incluso si no se había configurado una zona horaria.

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 configuras una zona horaria, verás errores en tu código relacionados con los valores de nil. Si utiliza Rails, la zona horaria predeterminada ya está configurada en UTC. Si no está utilizando Rails, puede establecer una zona horaria al inicio de su programa de la siguiente manera:

Time.zone = 'UTC'

Esto establecerá la zona horaria en UTC. Puedes ver todos los nombres de zonas horarias disponibles ejecutando el siguiente comando:

$ ruby -ractive_support/values/time_zone \
-e 'puts ActiveSupport::TimeZone::MAPPING.keys'

Considera 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 creen o carguen con opciones de almacenamiento explícitas recordarán esas opciones (incluidos un cliente con nombre, una base de datos diferente o una colección diferente).

Si necesitas la versión heredada (anterior a v9.0) comportamiento, puedes activarlo con la siguiente bandera:

Mongoid.legacy_persistence_context_behavior = true

Esta bandera viene por defecto como falsa en Mongoid v9.0.

Volver

Opciones de configuración de Rails

En esta página