{"metadata": {"vulnerability": "CVE-2026-93765", "count": 16, "kinds": {"milestone": 4, "sighting": 4, "kev": 0, "other": 8}, "linked_omitted": 0}, "data": [{"timestamp": "2026-09-18T16:51:43.596Z", "date_only": false, "value": "2026-09-18T16:51:43.596Z", "kind": "milestone", "label": "Reserved", "source": "cvelistv5", "record": "CVE-2026-93765", "field": "cveMetadata.dateReserved"}, {"timestamp": "2026-09-18T17:01:09.031Z", "date_only": false, "value": "2026-09-18T17:01:09.031Z", "kind": "milestone", "label": "Published", "source": "cvelistv5", "record": "CVE-2026-93765", "field": "cveMetadata.datePublished", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-09-18T17:01:09.031Z", "date_only": false, "value": "2026-09-18T17:01:09.031Z", "kind": "other", "label": "Updated", "source": "cvelistv5 / mongodb", "record": "CVE-2026-93765", "field": "containers.cna.providerMetadata.dateUpdated"}, {"timestamp": "2026-09-18T17:17:07Z", "date_only": false, "value": "2026-09-18T17:17:07Z", "kind": "other", "label": "Nvd published at", "source": "github \u00b7 GHSA-8899-FXX7-FWX3", "record": "GHSA-8899-FXX7-FWX3", "field": "database_specific.nvd_published_at", "linked_record": true}, {"timestamp": "2026-09-18T17:17:07.730Z", "date_only": false, "value": "2026-09-18T17:17:07.730", "kind": "milestone", "label": "Published", "source": "fkie_nvd \u00b7 FKIE_CVE-2026-93765", "record": "FKIE_CVE-2026-93765", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event", "linked_record": true}, {"timestamp": "2026-09-18T18:02:53.190Z", "date_only": false, "value": "2026-09-18T18:02:53.190693Z", "kind": "sighting", "label": "Seen", "source": "https://bsky.app/profile/thehackerwire.bsky.social/post/3mvsqurpkvk2k", "record": "CVE-2026-93765", "field": "creation_timestamp", "uuid": "1195b42e-f8e8-4775-9e9d-134797a60ca4", "content": "\ud83d\udd34 CVE-2026-93765 - Critical (9.1)\n\nMongoid contains an unsafe reflection weakness in the document persistence layer of its object-do...\n\nhttps://www.thehackerwire.com/vulnerability/CVE-2026-93765/\n\n#infosec #cybersecurity #CVE #vulnerability #security #patchstack", "url": "https://bsky.app/profile/thehackerwire.bsky.social/post/3mvsqurpkvk2k"}, {"timestamp": "2026-09-18T18:03:31.457Z", "date_only": false, "value": "2026-09-18T18:03:31.457576Z", "kind": "sighting", "label": "Seen", "source": "https://bsky.app/profile/cve.skyfleet.blue/post/jzx6i4exkhcn2", "record": "CVE-2026-93765", "field": "creation_timestamp", "uuid": "3a15f572-1518-4098-886b-b440256e54f9", "content": "CVE-2026-93765 - Document deletion and process crash via unvalidated method-name dispatch in atomic pop operation\nCVE ID : CVE-2026-93765\n \n Published : Sept. 18, 2026, 5:17 p.m. | 23\u00a0minutes ago\n \n Description : Mongoid contains an unsafe reflection weakness in the document p...", "url": "https://bsky.app/profile/cve.skyfleet.blue/post/jzx6i4exkhcn2"}, {"timestamp": "2026-09-18T18:31:43Z", "date_only": false, "value": "2026-09-18T18:31:43Z", "kind": "milestone", "label": "Published", "source": "github \u00b7 GHSA-8899-FXX7-FWX3", "record": "GHSA-8899-FXX7-FWX3", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event", "linked_record": true}, {"timestamp": "2026-09-18T18:31:43Z", "date_only": false, "value": "2026-09-18T18:31:43Z", "kind": "other", "label": "Updated", "source": "github \u00b7 GHSA-8899-FXX7-FWX3", "record": "GHSA-8899-FXX7-FWX3", "field": "modified", "linked_record": true}, {"timestamp": "2026-09-21T18:47:10.872Z", "date_only": false, "value": "2026-09-21T18:47:10.872048Z", "kind": "other", "label": "Recorded", "source": "cvelistv5 / CISA-ADP", "record": "CVE-2026-93765", "field": "containers.adp.0.metrics.0.other.content.timestamp"}, {"timestamp": "2026-09-21T18:47:10.872Z", "date_only": false, "value": "2026-09-21T18:47:10.872048Z", "kind": "other", "label": "Recorded", "source": "fkie_nvd \u00b7 FKIE_CVE-2026-93765", "record": "FKIE_CVE-2026-93765", "field": "metrics.ssvcV203.0.ssvcData.timestamp", "linked_record": true}, {"timestamp": "2026-09-21T18:47:20.835Z", "date_only": false, "value": "2026-09-21T18:47:20.835Z", "kind": "other", "label": "Updated", "source": "cvelistv5", "record": "CVE-2026-93765", "field": "cveMetadata.dateUpdated"}, {"timestamp": "2026-09-21T18:47:20.835Z", "date_only": false, "value": "2026-09-21T18:47:20.835Z", "kind": "other", "label": "Updated", "source": "cvelistv5 / CISA-ADP", "record": "CVE-2026-93765", "field": "containers.adp.0.providerMetadata.dateUpdated"}, {"timestamp": "2026-09-25T14:10:39.357Z", "date_only": false, "value": "2026-09-25T14:10:39.357", "kind": "other", "label": "Updated", "source": "fkie_nvd \u00b7 FKIE_CVE-2026-93765", "record": "FKIE_CVE-2026-93765", "field": "lastModified", "linked_record": true}, {"timestamp": "2026-09-26T14:07:09.264Z", "date_only": false, "value": "2026-09-26T14:07:09.264487Z", "kind": "sighting", "label": "Seen", "source": "https://bsky.app/profile/cyberhub.blog/post/3mwghgljxm22x", "record": "CVE-2026-93765", "field": "creation_timestamp", "uuid": "64d44b59-cad5-4837-b794-5003ab088e12", "content": "\ud83d\udccc CVE-2026-93765 - Mongoid contains an unsafe reflection weakness in the document persistence layer of its object-document mapping code. Input whose keys are passed thro... https://www.cyberhub.blog/cves/CVE-2026-93765", "url": "https://bsky.app/profile/cyberhub.blog/post/3mwghgljxm22x"}, {"timestamp": "2026-11-12T19:12:50Z", "date_only": false, "value": "2026-11-12T19:12:50.000000Z", "kind": "sighting", "label": "Seen", "source": "https://gist.github.com/afonso-sbf/009672f0e12db24bee017eb2a670d9e5", "record": "CVE-2026-93765", "field": "creation_timestamp", "uuid": "d6ea639b-89e9-49c7-a23d-3d6a09f99910", "content": "# Guia de Upgrade do Mongoid \u2014 7.5.4 \u2192 9.1.x\n\n&gt; Mapeamento de breaking changes, compatibilidade (Ruby / Rails / mongo driver / BSON / MongoDB Server) e refer\u00eancias (release notes, JIRA, PRs) para planejar a atualiza\u00e7\u00e3o da gem `mongoid` a partir da **7.5.4**, no esp\u00edrito do [Upgrading Ruby on Rails](https://guides.rubyonrails.org/upgrading_ruby_on_rails.html).\n&gt;\n&gt; \u00daltima revis\u00e3o: 2026-11-12. Vers\u00f5es correntes: **9.1.1** (s\u00e9rie atual), **9.0.12**, **8.1.13**, **8.0.13**, **7.6.2** (todas lan\u00e7adas em 17/09/2026 como patches de seguran\u00e7a). Driver `mongo` corrente: **2.26.1** (04/11/2026).\n&gt;\n&gt; Metodologia da revis\u00e3o: gemspecs conferidos na API do RubyGems; defaults de flags conferidos em `lib/mongoid/config.rb` e `lib/mongoid/config/defaults.rb` de cada tag do reposit\u00f3rio `mongodb/mongoid`; CVEs conferidas no cve.org; tabelas de compatibilidade conferidas no reposit\u00f3rio oficial de documenta\u00e7\u00e3o da MongoDB (`mongodb/docs`, `content/drivers/source/includes/compatibility/`).\n\n---\n\n## \u00cdndice\n\n1. [Como usar este guia](#1-como-usar-este-guia)\n2. [Panorama das vers\u00f5es e ciclo de vida](#2-panorama-das-vers\u00f5es-e-ciclo-de-vida)\n3. [Alerta de seguran\u00e7a: por que sair da 7.5.4 agora](#3-alerta-de-seguran\u00e7a-por-que-sair-da-754-agora)\n4. [Matriz de compatibilidade](#4-matriz-de-compatibilidade)\n5. [Ordem recomendada de atualiza\u00e7\u00e3o](#5-ordem-recomendada-de-atualiza\u00e7\u00e3o)\n6. [Pr\u00e1ticas gerais para qualquer salto de vers\u00e3o](#6-pr\u00e1ticas-gerais-para-qualquer-salto-de-vers\u00e3o)\n7. [Etapa 0 \u2014 7.5.4 \u2192 7.6.2](#7-etapa-0--754--762)\n8. [Etapa 1 \u2014 7.6 \u2192 8.0](#8-etapa-1--76--80)\n9. [Etapa 2 \u2014 8.0 \u2192 8.1](#9-etapa-2--80--81)\n10. [Etapa 3 \u2014 8.1 \u2192 9.0](#10-etapa-3--81--90)\n11. [Etapa 4 \u2014 patches 9.0.x com mudan\u00e7a de comportamento](#11-etapa-4--patches-90x-com-mudan\u00e7a-de-comportamento)\n12. [Etapa 5 \u2014 9.0 \u2192 9.1](#12-etapa-5--90--91)\n13. [Preparando-se para o Mongoid 10](#13-preparando-se-para-o-mongoid-10)\n14. [Onde consultar: release notes, JIRA e PRs por tema](#14-onde-consultar-release-notes-jira-e-prs-por-tema)\n15. [Checklist de execu\u00e7\u00e3o](#15-checklist-de-execu\u00e7\u00e3o)\n\n---\n\n## 1. Como usar este guia\n\n- **Suba uma vers\u00e3o minor/major por vez**, rodando a su\u00edte de testes completa em cada etapa. Cada salto tem uma se\u00e7\u00e3o pr\u00f3pria abaixo com: pr\u00e9-requisitos, breaking changes, flags de compatibilidade e refer\u00eancias.\n- Antes de cada etapa, leia a se\u00e7\u00e3o **Matriz de compatibilidade** para garantir que Ruby, Rails, `mongo` (driver) e `bson` j\u00e1 est\u00e3o em vers\u00f5es aceitas pelo Mongoid alvo. Em geral, **Ruby e Rails devem subir antes** (dentro da faixa suportada pela vers\u00e3o *atual* do Mongoid), e o Mongoid sobe depois.\n- O Mongoid, a partir da 8.1, oferece `config.load_defaults `, que funciona como o `config.load_defaults` do Rails: permite subir a gem mantendo o comportamento antigo e depois migrar as flags uma a uma.\n- Itens marcados com \u26a0\ufe0f s\u00e3o **breaking changes** com impacto prov\u00e1vel em aplica\u00e7\u00f5es reais. Itens marcados com \ud83d\udd12 s\u00e3o corre\u00e7\u00f5es de seguran\u00e7a.\n\n---\n\n## 2. Panorama das vers\u00f5es e ciclo de vida\n\n| S\u00e9rie | \u00daltimo patch | Lan\u00e7amento do primeiro release | Status | Observa\u00e7\u00f5es |\n|---|---|---|---|---|\n| 7.5.x | 7.5.4 (ago/2023) | jul/2022 | Fim de linha; **sem patch de seguran\u00e7a** para as CVEs de 2026 | 7.5.4 \u00e9 a \u00faltima 7.5; os fixes de set/2026 sa\u00edram s\u00f3 na 7.6.2 |\n| 7.6.x | 7.6.2 (set/2026) | dez/2025 | **EOL em 31/12/2026** (aviso oficial no release 7.6.2) | Release \"ponte\": 7.5 + compatibilidade com driver atual + security fixes (\u26a0\ufe0f a 7.6.2 muda defaults de seguran\u00e7a \u2014 ver \u00a77) |\n| 8.0.x | 8.0.13 (set/2026) | 2022 | Manuten\u00e7\u00e3o (patches de seguran\u00e7a) | Primeiro major com flags `broken_*`/`legacy_*` viradas |\n| 8.1.x | 8.1.13 (set/2026) | 2023 | Manuten\u00e7\u00e3o (patches de seguran\u00e7a) | Introduz `load_defaults`, deprecia flags da 7.x |\n| 9.0.x | 9.0.12 (set/2026) | mai/2024 | Manuten\u00e7\u00e3o ativa | Remove flags depreciadas; novos defaults; Ruby 4.0 a partir de 9.0.11 |\n| 9.1.x | 9.1.1 (set/2026) | mai/2026 | **S\u00e9rie atual** | Vector search, `eager_load`, `isolation_level`, `raw`; vira defaults de 9.0.11 |\n| 10.0 | \u2014 | \u2014 | Futuro | Remo\u00e7\u00e3o anunciada de v\u00e1rias op\u00e7\u00f5es (ver \u00a713) |\n\nFontes: [Releases no GitHub](https://github.com/mongodb/mongoid/releases), [RubyGems](https://rubygems.org/gems/mongoid/versions), [Release Notes oficiais](https://www.mongodb.com/docs/mongoid/current/reference/release-notes/).\n\n---\n\n## 3. Alerta de seguran\u00e7a: por que sair da 7.5.4 agora\n\nEm **18/09/2026** a MongoDB publicou oito CVEs do Mongoid (**CVE-2026-93758 a CVE-2026-93765**), corrigidas em **9.1.1, 9.0.12, 8.1.13, 8.0.13 e 7.6.2**. A **7.5.4 est\u00e1 na lista de vers\u00f5es afetadas** de pelo menos duas delas e **n\u00e3o recebeu patch** (a corre\u00e7\u00e3o para a s\u00e9rie 7 saiu apenas em 7.6.2):\n\n| CVE | Tema | Ticket | Vers\u00f5es afetadas (resumo) | Corre\u00e7\u00e3o |\n|---|---|---|---|---|\n| CVE-2026-93758 (CVSS 8.1) | IDOR em nested attributes: id de outro usu\u00e1rio podia ser \"reparentado\" | [MONGOID-5992](https://jira.mongodb.org/browse/MONGOID-5992) | 8.0.0\u20138.0.12, 8.1.0\u20138.1.12, 9.0.0\u20139.0.11, 9.1.0 | ids resolvidos **dentro da associa\u00e7\u00e3o**; `allow_reparenting_via_nested_attributes` passa a `false` |\n| CVE-2026-93759 (CVSS 8.6) | `where(\"string\")` virava `$where` (JS no servidor) | [MONGOID-5993](https://jira.mongodb.org/browse/MONGOID-5993) | idem | String em `where` levanta `Mongoid::Errors::InvalidQuery` salvo `allow_unsafe_query_operators = true` |\n| CVE-2026-93760 (CVSS 8.2) | NoSQL injection via operadores JS (`$where`, `$function`, `$accumulator`) em qualquer profundidade | [MONGOID-5994](https://jira.mongodb.org/browse/MONGOID-5994) | 8.0.0\u20138.0.12, 8.1.0\u20138.1.12, 9.0.0\u20139.0.11, 9.1.0 | **`Mongoid.allow_unsafe_query_operators` agora default `false`** |\n| CVE-2026-93761 (CVSS 7.5) | ReDoS em queries em mem\u00f3ria (associa\u00e7\u00f5es embutidas) | [MONGOID-5981](https://jira.mongodb.org/browse/MONGOID-5981) | **7.2.0\u20137.6.1 (inclui 7.5.4)**, 8.x, 9.x | `Mongoid.in_memory_regexp_time_limit` (default 5.0s) \u2192 `Mongoid::Errors::InMemoryRegexpTimeout` |\n| CVE-2026-93762 (CVSS 9.8) | Unsafe reflection no caminho de query em mem\u00f3ria (nome de campo vindo do usu\u00e1rio virava chamada de m\u00e9todo) | [MONGOID-5973](https://jira.mongodb.org/browse/MONGOID-5973) | **7.5.0\u20137.5.4**, 7.6.0\u20137.6.1, 8.x, 9.x | Nomes de campo tratados como dado, n\u00e3o como m\u00e9todo |\n| CVE-2026-93765 (CVSS 9.1) | Dispatch de nome de m\u00e9todo n\u00e3o validado na opera\u00e7\u00e3o at\u00f4mica `pop` (dele\u00e7\u00e3o de documento / crash do processo) | [MONGOID-5973](https://jira.mongodb.org/browse/MONGOID-5973) | 8.0.0\u20138.0.12, 8.1.0\u20138.1.12, 9.0.0\u20139.0.11, 9.1.0 | Nomes de campo tratados como dado, n\u00e3o como m\u00e9todo |\n| CVE-2026-93763 / CVE-2026-93764 (CVSS 6.5 cada) | Gera\u00e7\u00e3o de schema de encripta\u00e7\u00e3o autom\u00e1tica (CSFLE): nome de database \"callable\" n\u00e3o resolvido / modelos embutidos pulados \u2192 campos gravados em texto puro | [MONGOID-5984](https://jira.mongodb.org/browse/MONGOID-5984), [MONGOID-5989](https://jira.mongodb.org/browse/MONGOID-5989) | 9.0.0\u20139.0.11, 9.1.0 | Escrita em modelo sem schema levanta `Mongoid::Errors::NoEncryptionSchema` |\n\n&gt; \u26a0\ufe0f **Aten\u00e7\u00e3o:** embora o cve.org s\u00f3 liste 8.0+ como afetadas pelas CVEs 93758/93759/93760, a **7.6.2 tamb\u00e9m recebeu os backports de MONGOID-5992, 5993 e 5994** \u2014 com os mesmos defaults novos (`allow_unsafe_query_operators = false`, `allow_reparenting_via_nested_attributes = false`). Ou seja, **7.6.2, 8.0.13, 8.1.13, 9.0.12 e 9.1.1 mudam comportamento** em apps que usam `$where`/`where(\"js\")`/`$function`/`$accumulator` ou que movem filhos entre pais via nested attributes. Confirmado em `lib/mongoid/config.rb` de cada tag e nos release notes do GitHub.\n\nAl\u00e9m dessas, em **jan/2026** saiu a corre\u00e7\u00e3o de *unsafe reflection* em `Mongoid::Criteria.from_hash` / `to_criteria` ([MONGOID-5919](https://jira.mongodb.org/browse/MONGOID-5919), afetando 7.0.0\u20137.6.0, 8.0.x \u2264 8.0.11, 8.1.x \u2264 8.1.11, 9.0.x \u2264 9.0.9), lan\u00e7ada em 9.0.10, 8.1.12, 8.0.12 e 7.6.1.\n\n&gt; **Implica\u00e7\u00e3o pr\u00e1tica:** o passo m\u00ednimo e imediato \u00e9 **7.5.4 \u2192 7.6.2** (mesma linha de c\u00f3digo da 7.5, mesma API e mesmas flags `broken_*`/`legacy_*`), **mas n\u00e3o \u00e9 um upgrade \"no-op\"**: os defaults de seguran\u00e7a acima entram j\u00e1 nesta vers\u00e3o. Ver \u00a77.\n\nFontes: [MongoDB Alerts](https://www.mongodb.com/resources/products/alerts), [Release 9.1.1](https://github.com/mongodb/mongoid/releases/tag/v9.1.1), [Release notes 9.0.12](https://www.mongodb.com/docs/mongoid/current/reference/release-notes/).\n\n---\n\n## 4. Matriz de compatibilidade\n\n### 4.1 Constraints reais do gemspec (o que o Bundler vai impor)\n\nEsta \u00e9 a fonte mais dura de verdade \u2014 o `bundle update` falha se a faixa n\u00e3o bater.\n\n| Mongoid | `activemodel` (= Rails) | `mongo` (driver) | `bson` (dev dep / testado) | Ruby m\u00ednimo (gemspec) | Outras deps |\n|---|---|---|---|---|---|\n| **7.5.4** | `&gt;= 5.1, &lt; 7.1, != 7.0.0` | `&gt;= 2.10.5, &lt; 3.0` | `&gt;= 4.9.4, &lt; 5.0` | `&gt;= 2.5` | `ruby2_keywords` |\n| **7.6.0 \u2013 7.6.2** | `&gt;= 5.1, &lt; 7.1, != 7.0.0` | `&gt;= 2.10.5, &lt; 3.0` | `&gt;= 4.9.4, &lt; 6.0` | `&gt;= 2.5` (README declara MRI 2.7\u20133.1, JRuby 9.3) | `ruby2_keywords` |\n| **8.0.1 \u2013 8.0.6** | `&gt;= 5.1, &lt; 7.1, != 7.0.0` | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 5.0` | `&gt;= 2.6` | `ruby2_keywords` |\n| **8.0.7 \u2013 8.0.13** | `&gt;= 5.1, &lt; 7.2, != 7.0.0` (Rails 7.1) | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 5.0` | `&gt;= 2.6` | `ruby2_keywords` |\n| **8.1.0 \u2013 8.1.2** | `&gt;= 5.1, &lt; 7.1, != 7.0.0` | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 5.0` | `&gt;= 2.6` | `concurrent-ruby`, `ruby2_keywords` |\n| **8.1.3 \u2013 8.1.5** | `&gt;= 5.1, &lt; 7.2, != 7.0.0` (Rails 7.1) | idem | idem | idem | idem |\n| **8.1.6** | `&gt;= 5.1, &lt; 7.3, != 7.0.0` (Rails 7.2) | idem | idem | idem | idem |\n| **8.1.7 \u2013 8.1.13** | `&gt;= 5.1, &lt; 8.1, != 7.0.0` (Rails 8.0) | idem | idem | idem | idem |\n| **9.0.0 \u2013 9.0.1** | `&gt;= 5.1, &lt; 7.2, != 7.0.0` | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 6.0` | `&gt;= 2.7` | `concurrent-ruby` |\n| **9.0.2** | `&gt;= 5.1, &lt; 7.3, != 7.0.0` (Rails 7.2) | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 6.0` | `&gt;= 2.7` | `concurrent-ruby` |\n| **9.0.3 \u2013 9.0.8** | `&gt;= 5.1, &lt; 8.1, != 7.0.0` (Rails 8.0) | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 6.0` | `&gt;= 2.7` | `concurrent-ruby` |\n| **9.0.9+ / 9.1.x** | `&gt;= 5.1, &lt; 8.2, != 7.0.0` | `&gt;= 2.18.0, &lt; 3.0` | `&gt;= 4.14.0, &lt; 6.0` | `&gt;= 2.7` | `concurrent-ruby`, **`ostruct`** (9.0.11+) |\n\nNotas:\n- **Rails 7.0.0 exato \u00e9 exclu\u00eddo em todas as s\u00e9ries** (`!= 7.0.0`); use 7.0.1+.\n- **Rails 8.1 s\u00f3 \u00e9 aceito pelo gemspec a partir de 9.0.9 / 9.1.0** ([PR #6059](https://github.com/mongodb/mongoid/pull/6059)). **Toda a s\u00e9rie 8.1 (inclusive 8.1.12 e 8.1.13) limita `activemodel &lt; 8.1`** \u2014 n\u00e3o h\u00e1 Rails 8.1 com Mongoid 8.x.\n- **`concurrent-ruby`** s\u00f3 entra como depend\u00eancia na 8.1.0 (a s\u00e9rie 8.0.x n\u00e3o depende dela). `ruby2_keywords` sai na 9.0.\n- **`mongo &gt;= 2.18`** \u00e9 exig\u00eancia a partir do Mongoid 8.0. O driver corrente \u00e9 **2.26.1**; a s\u00e9rie 7.x s\u00f3 foi oficialmente validada contra drivers 2.18+ na **7.6.0** ([PR #6036](https://github.com/mongodb/mongoid/pull/6036)). Aten\u00e7\u00e3o \u00e0s restri\u00e7\u00f5es do pr\u00f3prio driver: **`mongo` 2.22+ exige Ruby \u2265 2.7** e **`mongo` 2.26 deixa de suportar MongoDB Server 4.2** (ver \u00a74.5).\n- **BSON n\u00e3o \u00e9 depend\u00eancia de runtime do Mongoid** \u2014 a coluna `bson` acima \u00e9 s\u00f3 depend\u00eancia de desenvolvimento (o que a gem \u00e9 testada contra). Quem restringe o `bson` em runtime \u00e9 o driver: `mongo` 2.18\u20132.19 exige `bson &lt; 5`; **`mongo` \u2265 2.20 aceita `bson &lt; 6`**. Logo, um `bundle update` pode trazer BSON 5 para qualquer s\u00e9rie do Mongoid.\n- **BSON 5**: suportado oficialmente a partir do Mongoid 9.0 ([MONGOID-5739](https://jira.mongodb.org/browse/MONGOID-5739), [PR #5801](https://github.com/mongodb/mongoid/pull/5801)). A flag `allow_bson5_decimal128` ([MONGOID-5650](https://jira.mongodb.org/browse/MONGOID-5650)) existe **apenas a partir de 8.0.6 e 8.1.2** (e na 9.x). \u26a0\ufe0f **Ela n\u00e3o existe em nenhuma vers\u00e3o 7.x (nem 7.5.4, nem 7.6.x)**: num app 7.x, se o Bundler resolver `bson 5.x`, campos `BSON::Decimal128` passam a ser demongoizados de forma diferente sem nenhuma flag de prote\u00e7\u00e3o. **Recomenda\u00e7\u00e3o: `gem 'bson', '&lt; 5'` enquanto estiver na 7.x e na 8.x**, liberando BSON 5 s\u00f3 na 9.0 (decidindo `allow_bson5_decimal128`).\n- A depend\u00eancia `ostruct` foi adicionada em 9.0.11 porque `OpenStruct` deixou de ser default gem no Ruby 3.5/4.0.\n\n### 4.2 Ruby (tabela oficial + README)\n\n| Mongoid | Ruby 4.0 | 3.4 | 3.3 | 3.2 | 3.1 | 3.0 | 2.7 | 2.6 | 2.5 | JRuby |\n|---|---|---|---|---|---|---|---|---|---|---|\n| 9.1 | \u2713 | \u2713* | \u2713* | \u2713 | \u2713 | \u2713 | \u2713 | \u2014 | \u2014 | 9.4, 10.0 (README) |\n| 9.0 | \u2713 (\u2265 9.0.11, PR #6136) | \u2713* | \u2713* (\u2265 9.0.3, [MONGOID-5792](https://jira.mongodb.org/browse/MONGOID-5792)) | \u2713 | \u2713 | \u2713 | \u2713 | \u2014 | \u2014 | 9.4 |\n| 8.1 | \u2014 | \u2014 | n\u00e3o oficial** | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2014 | 9.3 |\n| 8.0 | \u2014 | \u2014 | \u2014 | \u2014 | \u2713 | \u2713 | \u2713 | \u2713 | \u2014 | 9.3 |\n| 7.6 | \u2014 | \u2014 | n\u00e3o oficial** | n\u00e3o oficial** | \u2713 | \u2713 | \u2713 | \u2713 (gemspec; README diz 2.7+) | \u2717 (gemspec ainda aceita) | 9.3 |\n| 7.5 | \u2014 | \u2014 | \u2014 | \u2014 | \u2713 | \u2713 | \u2713 | \u2713 | D | 9.3 (9.2 D) |\n\n\\* O README do reposit\u00f3rio (9.x) declara \"MRI 2.7 \u2013 4.0, JRuby 9.4 e 10.0\"; a tabela oficial das docs lista colunas 4.0, 3.2, 3.1, 3.0, 2.7. Ruby 3.3 entrou na matriz de testes da 9.0 na 9.0.3 (MONGOID-5792) e 3.4 est\u00e1 dentro da faixa do README \u2014 trate ambos como suportados na 9.x.\n\n\\*\\* N\u00e3o aparece nas tabelas oficiais nem no README da s\u00e9rie. O MONGOID-5792 (Ruby 3.3) **n\u00e3o** foi portado para a 8.1; a CI das s\u00e9ries 7.6 e 8.1 ganhou eixos de Ruby 3.2/3.3 com o novo toolchain (7.6.0 / 8.1.12), o que sugere que funciona, mas sem garantia oficial. A tabela oficial da 7.5/7.6 vai at\u00e9 Ruby 3.1.\n\n**Implica\u00e7\u00e3o para a ordem:** com Mongoid 7.x, o teto oficial \u00e9 **Ruby 3.1** (3.2 funciona na pr\u00e1tica, sem garantia); **Ruby 3.2 oficial a partir da 8.1**; **Ruby 3.3 oficial s\u00f3 na 9.0.3+**; **Ruby 3.4/4.0 s\u00f3 na 9.x** (4.0 oficial em 9.0.11+). Lembre tamb\u00e9m que `mongo` 2.22+ exige Ruby \u2265 2.7.\n\n### 4.3 Rails (tabela oficial)\n\n| Mongoid | Rails 8.1 | 8.0 | 7.2 | 7.1 | 7.0 | 6.1 | 6.0 | 5.2 | 5.1 |\n|---|---|---|---|---|---|---|---|---|---|\n| 9.1 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 (\u2260 7.0.0) | \u2713 | \u2713 | \u2014 | \u2014 |\n| 9.0 | \u2713 (\u2265 9.0.9, PR #6059) | \u2713 (\u2265 9.0.3, [MONGOID-5818](https://jira.mongodb.org/browse/MONGOID-5818)) | \u2713 (\u2265 9.0.2) | \u2713 | \u2713 (\u2260 7.0.0) | \u2713 | \u2713 | \u2014 | \u2014 |\n| 8.1 | \u2717 (gemspec `&lt; 8.1` em toda a s\u00e9rie, inclusive 8.1.13) | \u2713 (\u2265 8.1.7) | \u2713 (\u2265 8.1.6) | \u2713 (\u2265 8.1.3) | \u2713 (\u2260 7.0.0) | \u2713 | \u2713 | \u2713 (n\u00e3o com Ruby 3) | \u2014 |\n| 8.0 | \u2717 | \u2717 | \u2717 | \u2713 (\u2265 8.0.7) | \u2713 (\u2260 7.0.0) | \u2713 | \u2713 | \u2713 (n\u00e3o com Ruby 3) | \u2014 |\n| 7.6 | \u2717 | \u2717 | \u2717 | \u2717 (gemspec `&lt; 7.1`) | \u2713 (\u2260 7.0.0) | \u2713 | \u2713 | \u2713 (n\u00e3o com Ruby 3) | D |\n| 7.5 | \u2717 | \u2717 | \u2717 | \u2717 (gemspec `&lt; 7.1`) | \u2713 (\u2260 7.0.0) | \u2713 | \u2713 | \u2713 (n\u00e3o com Ruby 3) | D |\n\n&gt; Nota: tabelas de docs mais antigas mostram \"7.5 \u2713 Rails 7.1\", mas o **gemspec de 7.5.4 e 7.6.x limita `activemodel &lt; 7.1`** \u2014 o Bundler n\u00e3o vai resolver. Considere Rails 7.0 o teto real da s\u00e9rie 7.\n\n**Implica\u00e7\u00e3o para a ordem:** com Mongoid 7.x, o teto \u00e9 **Rails 7.0.x** (\u2260 7.0.0). **Rails 7.1 exige Mongoid 8.0.7+**; **Rails 7.2 exige 8.1.6+/9.0.2+**; **Rails 8.0 exige 8.1.7+/9.0.3+**; **Rails 8.1 exige 9.0.9+/9.1.0+**.\n\n### 4.4 Driver `mongo` e `bson`\n\n| Mongoid | Driver 2.18+ | Driver 2.10 \u2013 2.17 | Driver 2.7 \u2013 2.9 | BSON 4 | BSON 5 |\n|---|---|---|---|---|---|\n| 9.0 \u2013 9.1 | \u2713 | \u2014 | \u2014 | \u2713 | \u2713 oficial (decidir `allow_bson5_decimal128`) |\n| 8.0 \u2013 8.1 | \u2713 | \u2014 | \u2014 | \u2713 | 8.0.6+/8.1.2+: via `allow_bson5_decimal128`, n\u00e3o testado; antes disso, \u2717 |\n| 7.6 (linha 7.5) | \u2713 (validado em 7.6.0) | \u2713 | \u2014 | \u2713 | \u2717 \u2014 **sem flag**; fixar `bson &lt; 5` |\n| 7.5.x | \u2713 (tabela oficial da 7.6) | \u2713 | \u2014 | \u2713 | \u2717 \u2014 **sem flag**; fixar `bson &lt; 5` |\n| 7.2 \u2013 7.4 | \u2014 | \u2713 | \u2014 | \u2713 | \u2717 |\n\nA tabela oficial de docs ainda rotula a coluna como \"Driver 2.18 to 2.21\"; como o gemspec aceita `mongo &lt; 3.0`, na pr\u00e1tica vers\u00f5es mais novas do driver s\u00e3o instaladas \u2014 confira as restri\u00e7\u00f5es do driver em \u00a74.5 (servidor) e \u00a74.1 (Ruby).\n\n### 4.5 MongoDB Server \u00d7 driver \u00d7 Mongoid\n\nO Mongoid **n\u00e3o fala direto com o servidor**: quem implementa o protocolo \u00e9 o driver `mongo`. A compatibilidade efetiva \u00e9 a **interse\u00e7\u00e3o** entre o que o Mongoid suporta e o que o driver instalado suporta \u2014 e como o gemspec do Mongoid aceita qualquer `mongo &lt; 3.0`, um `bundle update` pode trocar o driver silenciosamente.\n\n**Mongoid \u00d7 MongoDB Server** (tabela oficial atual; 7.x conforme as docs embarcadas nas tags v7.6.2 e v8.1.13)\n\n| Mongoid | 9.0 | 8.2 | 8.0 | 7.0 | 6.0 | 5.0 | 4.4 | 4.2 | 4.0 | 3.6 | \u2264 3.4 |\n|---|---|---|---|---|---|---|---|---|---|---|---|\n| 9.0 \u2013 9.1 | \u229b | \u2713 (README) | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 (README) | \u2713 (README) | \u2717 |\n| 8.0 \u2013 8.1 | \u2014 | \u2014 | **\u2014 (n\u00e3o listado)** | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2717 (**removido na 8.0**) |\n| 7.6 (linha 7.5) | \u2014 | \u2014 | \u2713 (PR #6036) | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | D |\n| 7.5.4 | \u2014 | \u2014 | \u2014 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | D |\n\n**Driver `mongo` \u00d7 MongoDB Server** (tabela oficial atual)\n\n| Driver | 9.0 | 8.0 | 7.0 | 6.0 | 5.0 | 4.4 | 4.2 |\n|---|---|---|---|---|---|---|---|\n| 2.26 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | **\u2717** |\n| 2.24 \u2013 2.25 | \u229b | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 |\n| 2.21 \u2013 2.23 | \u2014 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 |\n| 2.19 \u2013 2.20 | \u2014 | \u229b | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 |\n| 2.18 | \u2014 | \u229b | \u229b | \u2713 | \u2713 | \u2713 | \u2713 |\n\n\u2713 = suporte completo \u00b7 \u229b = funciona, mas nem todas as features novas do servidor s\u00e3o suportadas \u00b7 \u2717 = n\u00e3o suportado.\n\n**Driver `mongo` \u00d7 Ruby** (gemspec + tabela oficial): 2.18\u20132.21 aceitam Ruby \u2265 2.5 (gemspec); **2.22+ exige Ruby \u2265 2.7**; Ruby 3.3 a partir de 2.21.1; Ruby 4.0 a partir de 2.23.\n\n**Conclus\u00f5es que afetam a ordem de upgrade:**\n1. **MongoDB 7.0 \u00e9 o \u00fanico servidor suportado oficialmente por todas as etapas** do caminho (7.5.4, 7.6, 8.0, 8.1, 9.0, 9.1). \u00c9 o \"denominador comum\" ideal para atravessar o upgrade do Mongoid.\n2. **MongoDB 8.0 tem um \"buraco\" na s\u00e9rie 8.x do Mongoid**: suportado na 7.6 e na 9.x, mas n\u00e3o listado para 8.0/8.1. Suba o servidor para 8.0 **depois** de chegar no Mongoid 9.0.\n3. **Servidor \u2264 3.4** precisa ir para \u2265 3.6 **antes** do Mongoid 8.0 (e, oficialmente, antes da 7.6).\n4. **Servidor 4.2**: o `mongo` 2.26 n\u00e3o o suporta mais. Fixe `gem 'mongo', '&lt; 2.26'` ou suba o servidor para 4.4+ **antes** de qualquer `bundle update`.\n5. **O servidor sobe um major por vez** (3.6 \u2192 4.0 \u2192 4.2 \u2192 4.4 \u2192 5.0 \u2192 6.0 \u2192 7.0 \u2192 8.0), ajustando `featureCompatibilityVersion` ao final de cada passo. Antes de cada passo, garanta que o driver instalado suporta o servidor alvo (2.19+ para 7.0, 2.21+ para 8.0, 2.26 para suporte completo a 9.0).\n6. MongoDB Server 6.0 e anteriores j\u00e1 est\u00e3o em EOL; vale usar o upgrade do Mongoid como oportunidade para chegar ao menos no 7.0.\n\nFontes das tabelas: reposit\u00f3rio oficial `mongodb/docs`, arquivos `content/drivers/source/includes/compatibility/mongoid/*.rst` e `.../ruby/*.rst` (renderizados em [Client Library Compatibility](https://www.mongodb.com/docs/mongoid/current/compatibility)); `docs/reference/compatibility.txt` nas tags v7.6.2 e v8.1.13 do reposit\u00f3rio `mongodb/mongoid`; [README](https://github.com/mongodb/mongoid) por tag; gemspecs no RubyGems.\n\n---\n\n## 5. Ordem recomendada de atualiza\u00e7\u00e3o\n\nPrinc\u00edpio: **nunca mude dois eixos ao mesmo tempo**. Cada passo abaixo altera s\u00f3 uma coisa (Mongoid, Ruby/Rails ou MongoDB Server).\n\n```\n Estado inicial: Mongoid 7.5.4 | Ruby \u2264 3.1 | Rails \u2264 7.0 | mongo 2.x | bson 4.x | MongoDB Server \u2265 3.6\n\n [0] Mongoid 7.5.4 \u2500\u2500\u25ba 7.6.2           \ud83d\udd12 seguran\u00e7a; mesma API, MAS novos defaults de seguran\u00e7a:\n      \u2502                                   allow_unsafe_query_operators=false, allow_reparenting_via_nested_attributes=false\n      \u2502                                   (fixar gem 'bson', '&lt; 5' \u2014 a 7.x n\u00e3o tem allow_bson5_decimal128)\n [1] (opcional) Ruby \u2500\u2500\u25ba 3.1 e Rails \u2500\u2500\u25ba 7.0.x (\u22607.0.0) \u2014 tetos oficiais da s\u00e9rie 7\n      \u2502\n [S1] MongoDB Server \u2500\u2500\u25ba 7.0           um major por vez + FCV; driver mongo \u2265 2.19\n      \u2502                                   (7.0 \u00e9 suportado por todas as etapas seguintes; ver \u00a74.5)\n [2] Mongoid 7.6.2 \u2500\u2500\u25ba 8.0.13          \u26a0\ufe0f flags viradas; callbacks; uncastable values; Decimal128\n      \u2502                                   (exige mongo \u2265 2.18; drop MongoDB \u2264 3.4; Ruby \u2265 2.6; Rails \u2265 5.2)\n [3] Rails \u2500\u2500\u25ba 7.1 (exige 8.0.7+)        agora poss\u00edvel\n      \u2502\n [4] Mongoid 8.0.13 \u2500\u2500\u25ba 8.1.13         config.load_defaults 8.0 \u2192 8.1; readonly!; upsert(replace:)\n      \u2502\n [5] Ruby \u2500\u2500\u25ba 3.2 ; Rails \u2500\u2500\u25ba 7.2 (8.1.6+) \u2500\u2500\u25ba 8.0 (8.1.7+)     [Rails 8.1 n\u00e3o \u00e9 poss\u00edvel na 8.x]\n      \u2502\n [6] Mongoid 8.1.13 \u2500\u2500\u25ba 9.0.12         \u26a0\ufe0f remo\u00e7\u00e3o das flags 7.x; load_defaults m\u00ednimo 8.0; novos defaults\n      \u2502                                   (exige Ruby \u2265 2.7 / JRuby 9.4; Rails \u2265 6.0; BSON 5 OK)\n [S2] MongoDB Server 7.0 \u2500\u2500\u25ba 8.0       driver mongo \u2265 2.21 (8.0 n\u00e3o \u00e9 oficial no Mongoid 8.x)\n      \u2502\n [7] Ruby \u2500\u2500\u25ba 3.3 (9.0.3+) / 3.4 / 4.0 (9.0.11+) ; Rails \u2500\u2500\u25ba 8.1 (9.0.9+)\n      \u2502\n [8] Mongoid 9.0.12 \u2500\u2500\u25ba 9.1.1          defaults de 9.0.11 viram false; novas features\n      \u2502\n [9] Preparar para 10.x (remover usos de op\u00e7\u00f5es anunciadas para remo\u00e7\u00e3o)\n      \u2502\n [S3] (futuro) MongoDB Server 9.0      driver mongo 2.26+ (Mongoid 9.x: suporte parcial \u229b)\n```\n\nSe o servidor j\u00e1 estiver em 8.0 hoje, a passagem pela s\u00e9rie 8.x do Mongoid fica fora da matriz oficial (funciona via driver \u2265 2.21, mas sem garantia). Nesse caso, reforce os testes de integra\u00e7\u00e3o contra o servidor real nas etapas [2]\u2013[4].\n\nRegras de depend\u00eancia que explicam a ordem:\n\n| Quero\u2026 | Preciso antes\u2026 |\n|---|---|\n| Rails 7.1 | Mongoid \u2265 8.0.7 |\n| Rails 7.2 | Mongoid \u2265 8.1.6 ou \u2265 9.0.2 |\n| Rails 8.0 | Mongoid \u2265 8.1.7 ou \u2265 9.0.3 |\n| Rails 8.1 | Mongoid \u2265 9.0.9 (ou 9.1.x) |\n| Ruby 3.2 (oficial) | Mongoid \u2265 8.1 |\n| Ruby 3.3 (oficial) | Mongoid \u2265 9.0.3 |\n| Ruby 3.4 / 4.0 | Mongoid 9.x (4.0 oficial em 9.0.11+) |\n| BSON 5 | Mongoid 9.x (8.0.6+/8.1.2+ s\u00f3 via `allow_bson5_decimal128`; 7.x nunca) |\n| Mongoid 8.0 | driver `mongo` \u2265 2.18; MongoDB Server \u2265 3.6; Ruby \u2265 2.6; Rails \u2265 5.2 |\n| Mongoid 9.0 | Ruby \u2265 2.7; Rails \u2265 6.0; `config.load_defaults` \u2265 8.0 (se usar) |\n| MongoDB Server 7.0 | driver `mongo` \u2265 2.19 (qualquer Mongoid a partir da 7.5.4) |\n| MongoDB Server 8.0 | driver `mongo` \u2265 2.21 **e** Mongoid 7.6.x ou 9.x (n\u00e3o oficial na 8.x) |\n| MongoDB Server 9.0 | driver `mongo` \u2265 2.26 (suporte completo) e Mongoid 9.x (parcial) |\n| Driver `mongo` 2.22+ | Ruby \u2265 2.7 |\n| Driver `mongo` 2.26 | MongoDB Server \u2265 4.4 |\n\n**Quest\u00f5es cr\u00edticas de retrocompatibilidade (onde n\u00e3o d\u00e1 para \"voltar atr\u00e1s\" facilmente):**\n\n1. **`BigDecimal` \u2192 `Decimal128` (Mongoid 8.0, `map_big_decimal_to_decimal128`)**: muda o tipo gravado no banco (String \u2192 Decimal128). Documentos novos ficam com tipo diferente dos antigos; downgrade exige cuidado com leitura mista. Decida a estrat\u00e9gia **antes** de subir para 8.0 (manter flag em `false` at\u00e9 migrar os dados, ou migrar).\n2. **Ordem dos callbacks (8.0)**: c\u00f3digo que dependia de `after_save` do pai rodar antes dos filhos (ou vice-versa) muda silenciosamente.\n3. **`upsert` passa de replace para update (default flip na 9.0)**: pode deixar campos \"fantasma\" no documento que antes eram sobrescritos.\n4. **Imutabilidade de `_id` (9.0, `immutable_ids`)**: c\u00f3digo que reatribui `_id` em documento persistido passa a lan\u00e7ar exce\u00e7\u00e3o.\n5. **Contexto de persist\u00eancia \"lembrado\" (9.0)**: documentos carregados via `with(client:/database:/collection:)` passam a gravar no mesmo contexto depois \u2014 quem usa multi-tenant via `with` precisa validar.\n6. **Callbacks de filhos n\u00e3o modificados (9.0.5\u20139.0.7)**: o MONGOID-5822 passou a disparar callbacks de filhos inalterados na 9.0.5 e foi revertido na 9.0.7. Para quem vem da 8.1 direto para 9.0.7+, **n\u00e3o h\u00e1 mudan\u00e7a** em rela\u00e7\u00e3o ao comportamento atual; s\u00f3 quebra para quem chegou a rodar 9.0.5/9.0.6. Relacionado (e esse sim muda): `autosave_saves_unchanged_documents = false` na 9.1 (item da \u00a712).\n7. **Nested attributes n\u00e3o reparentam mais (7.6.2 / 8.0.13 / 8.1.13 / 9.0.12 / 9.1.1, seguran\u00e7a)**: ids em `*_attributes=` passam a ser resolvidos dentro da associa\u00e7\u00e3o; fluxos leg\u00edtimos de \"mover\" filho entre pais quebram (`DocumentNotFound`) e `_destroy` de documento fora da associa\u00e7\u00e3o \u00e9 ignorado. Restaur\u00e1vel com `allow_reparenting_via_nested_attributes = true` (removido no 10.0).\n8. **Guarda de operadores de query (7.6.2 / 8.0.13 / 8.1.13 / 9.0.12 / 9.1.1, seguran\u00e7a)**: com `allow_unsafe_query_operators = false` (default), `where(\"js\")`, `$where`, `$function`, `$accumulator` levantam `InvalidQuery` em qualquer profundidade, **e todo operador no topo da express\u00e3o precisa estar em `Criteria::Queryable::Selectable::ALLOWED_QUERY_OPERATORS`**. `for_js` e `js_query` **n\u00e3o** s\u00e3o afetados. A flag **n\u00e3o** \u00e9 controlada por `load_defaults` \u2014 precisa ser setada explicitamente.\n\n---\n\n## 6. Pr\u00e1ticas gerais para qualquer salto de vers\u00e3o\n\n1. **Cobertura de testes** nos modelos (callbacks, valida\u00e7\u00f5es, dirty tracking, queries em embedded, `upsert`, `touch`, serializa\u00e7\u00e3o `as_json`/`serializable_hash`) \u2014 s\u00e3o os pontos que mais mudam entre vers\u00f5es.\n2. **Grep de \"pontos quentes\"** antes de cada salto (lista completa nas se\u00e7\u00f5es): `Mongoid::QueryCache`, `broken_`, `legacy_`, `compare_time_by_ms`, `object_id_as_json_oid`, `overwrite_chained_operators`, `use_activesupport_time_zone`, `for_js`, `geo_spacial`, `blank_criteria?`, `as_json(compact:`, `Time.configured`, `ActiveModel::MissingAttributeError`, `upsert`, `readonly`, `store_in` em embedded, `max_scan`, `where(\"` (string), `$where`, `$function`, `$accumulator`, `_attributes=`, `accepts_nested_attributes_for`, campos `BigDecimal`/`BSON::Decimal128`.\n7. **Fixe `bson` e `mongo` explicitamente no Gemfile** durante todo o processo (`bson &lt; 5` at\u00e9 a 9.0; `mongo &lt; 2.26` se o servidor for 4.2; `mongo &lt; 2.22` se ainda estiver em Ruby 2.6). Como o Mongoid aceita `mongo &lt; 3.0` e o `bson` vem transitivamente do driver, um `bundle update` pode trocar ambos sem aviso.\n3. **Use `config.load_defaults`** (8.1+) para subir a gem com o comportamento anterior e depois ir virando flags; a 9.0 exige `load_defaults` m\u00ednimo `8.0`.\n4. Ative `Mongoid.logger` em `DEBUG` em staging na primeira semana de cada salto para ver avisos de deprecia\u00e7\u00e3o (`Mongoid::Warnings`).\n5. Rode a aplica\u00e7\u00e3o com a nova vers\u00e3o em staging contra um **snapshot de produ\u00e7\u00e3o** \u2014 v\u00e1rios breaking changes s\u00f3 aparecem com dados legados (uncastable values, Decimal128 vs String, `_id` customizado).\n6. Para cada vers\u00e3o, leia as duas fontes: **release notes narrativas** (docs.mongodb.com) e **release no GitHub** (lista de tickets/PRs). A lista completa de bugs est\u00e1 no [JIRA MONGOID](https://jira.mongodb.org/projects/MONGOID).\n\n---\n\n## 7. Etapa 0 \u2014 7.5.4 \u2192 7.6.2\n\n**Objetivo:** aplicar corre\u00e7\u00f5es de seguran\u00e7a e validar contra o driver `mongo` atual, mantendo a API e as flags `broken_*`/`legacy_*` da 7.5. \u26a0\ufe0f **N\u00e3o \u00e9 um upgrade sem mudan\u00e7a de comportamento**: a 7.6.2 traz novos defaults de seguran\u00e7a (ver tabela).\n\n**Pr\u00e9-requisitos:** nenhum al\u00e9m do que a 7.5.4 j\u00e1 exige (`activemodel &gt;= 5.1, &lt; 7.1, != 7.0.0`; `mongo &gt;= 2.10.5`). A mudan\u00e7a de `bson &lt; 5.0` para `&lt; 6.0` no gemspec da 7.6 \u00e9 **s\u00f3 na depend\u00eancia de desenvolvimento** \u2014 n\u00e3o habilita BSON 5 de forma segura (n\u00e3o existe `allow_bson5_decimal128` na 7.x).\n\n**O que muda**\n\n| Vers\u00e3o | Mudan\u00e7a | Refer\u00eancia |\n|---|---|---|\n| 7.6.0 (dez/2025) | Sem mudan\u00e7as em `lib/`: valida\u00e7\u00e3o oficial contra drivers 2.18\u20132.21, nova CI (eixos Ruby 2.7\u20133.3, MongoDB at\u00e9 8.0); README passa a declarar MRI 2.7\u20133.1, JRuby 9.3 e MongoDB 3.6\u20138.0 (o gemspec continua aceitando Ruby \u2265 2.5) | [PR #6036](https://github.com/mongodb/mongoid/pull/6036) |\n| 7.6.1 (jan/2026) | \ud83d\udd12 Restringe `to_criteria`/`from_hash` (unsafe reflection) \u00b7 vers\u00e3o do Rails no handshake | [MONGOID-5919](https://jira.mongodb.org/browse/MONGOID-5919) (PR #6087), MONGOID-5864 (PR #6097) |\n| 7.6.2 (set/2026) | \ud83d\udd12 Backport de MONGOID-5973, 5981, 5992, 5993 e 5994 (CVE-2026-93758\u202693762, 93765). \u26a0\ufe0f **Novos defaults:** `allow_unsafe_query_operators = false` (bloqueia `$where`/`$function`/`$accumulator`/`where(\"string\")` e operadores de topo fora da allowlist); `allow_reparenting_via_nested_attributes = false` (nested attributes n\u00e3o movem filhos entre pais \u2192 `DocumentNotFound`); `in_memory_regexp_time_limit = 5.0` (\u2192 `Mongoid::Errors::InMemoryRegexpTimeout`) \u00b7 aviso de **EOL em 31/12/2026** | [Release 7.6.2](https://github.com/mongodb/mongoid/releases/tag/v7.6.2) (PR #6176) |\n\n**A\u00e7\u00f5es**\n```ruby\n# Gemfile\ngem 'mongoid', '~&gt; 7.6.2'\ngem 'bson', '&lt; 5'          # a s\u00e9rie 7 n\u00e3o tem allow_bson5_decimal128\n```\n```ruby\n# config/initializers/mongoid.rb \u2014 S\u00d3 se a su\u00edte mostrar que o app depende disso,\n# e de forma tempor\u00e1ria (avalie o risco de seguran\u00e7a):\nMongoid.allow_unsafe_query_operators = true\nMongoid.allow_reparenting_via_nested_attributes = true\n```\n- Grep por `where(\"`, `$where`, `$function`, `$accumulator`, `accepts_nested_attributes_for` / `_attributes=` antes de subir. Prefira reescrever as queries com hash/aggregation (ou `for_js`, que \u00e9 expl\u00edcito e n\u00e3o \u00e9 bloqueado) a reabrir a flag.\n- Rodar a su\u00edte. Se a app ainda estiver em MongoDB Server 3.4 ou Ruby 2.5/2.6, este \u00e9 o momento de atualizar a infra (deixam de ser suportados oficialmente; o driver `mongo` 2.22+ exige Ruby \u2265 2.7).\n- Se o app faz queries em mem\u00f3ria em associa\u00e7\u00f5es embutidas com regex vindo do usu\u00e1rio, revisar `Mongoid.in_memory_regexp_time_limit` e tratar `Mongoid::Errors::InMemoryRegexpTimeout`.\n\n**Depois desta etapa:** suba Ruby at\u00e9 3.1 (teto oficial da s\u00e9rie 7; 3.2 funciona na pr\u00e1tica) e Rails at\u00e9 7.0.x (\u2260 7.0.0). \u00c9 tamb\u00e9m o melhor momento para levar o **MongoDB Server at\u00e9 7.0** (ver \u00a74.5 e \u00a75).\n\n---\n\n## 8. Etapa 1 \u2014 7.6 \u2192 8.0\n\n**Release notes:** [Mongoid 8.0](https://www.mongodb.com/docs/mongoid/current/release-notes/mongoid-8.0/) \u00b7 [GitHub 8.0.0/8.0.1](https://github.com/mongodb/mongoid/releases?q=8.0) \u00b7 \u00c9pico de callbacks [MONGOID-4627](https://jira.mongodb.org/browse/MONGOID-4627).\n\n**Pr\u00e9-requisitos**\n- Ruby \u2265 2.6 (drop de 2.5) \u00b7 Rails \u2265 5.2 (drop de 5.1; Rails 7.1 s\u00f3 com 8.0.7+) \u00b7 **driver `mongo` \u2265 2.18** \u00b7 **MongoDB Server \u2265 3.6** (drop de 3.4 e anteriores).\n\n### 8.1 \u26a0\ufe0f Flags de comportamento com default virado\n\nTodas estas op\u00e7\u00f5es **existem** na 8.0 e podem ser setadas para o valor antigo em `mongoid.yml`/`Mongoid.configure` para subir sem mudar comportamento, e depois serem viradas uma a uma. **Elas s\u00e3o removidas na 9.0**, ent\u00e3o todo o trabalho de migra\u00e7\u00e3o tem que acontecer na 8.x.\n\n| Op\u00e7\u00e3o | Default 7.x | Default 8.0 | O que controla |\n|---|---|---|---|\n| `broken_aggregables` | `true` | `false` | Resultado de `sum` sobre conjunto de resultados vazio (comportamento quebrado mantido por compatibilidade quando `true`) |\n| `broken_alias_handling` | `true` | `false` | Com `true`, ignora aliases de campos em documentos **embutidos** em `pluck` e `distinct` |\n| `broken_and` | `true` | `false` | `and` com o mesmo operador no mesmo campo v\u00e1rias vezes passa a combinar as condi\u00e7\u00f5es (n\u00e3o sobrescreve) |\n| `broken_scoping` | `true` | `false` | Ao sair de um `with_scope` aninhado, o escopo volta para o escopo **pai** (com `true`, voltava para `nil`) |\n| `broken_updates` | `true` | `false` | Set/unset/reset de documentos embutidos persistidos corretamente (MONGOID-5206, MONGOID-5240) |\n| `compare_time_by_ms` | `false` | `true` | Compara\u00e7\u00e3o de `Time` em milissegundos no matcher em mem\u00f3ria (`_matches?`) |\n| `legacy_attributes` | `true` | `false` | `Document#attributes` passa a retornar sempre `Hash` (com `true`, retornava `BSON::Document` para documentos lidos do banco) |\n| `legacy_pluck_distinct` | `true` | `false` | `pluck`/`distinct` retornam valores demongoizados (tipados) |\n| `legacy_triple_equals` | `true` | `false` | `===` em `Criteria`/`Document` segue sem\u00e2ntica Ruby padr\u00e3o |\n| `object_id_as_json_oid` | `true` | `false` | `ObjectId#as_json` retorna string em vez de `{\"$oid\" =&gt; ...}` |\n| `overwrite_chained_operators` | `true` | `false` | `where(a: 1).where(a: 2)` combina (`$and`) em vez de sobrescrever |\n| `map_big_decimal_to_decimal128` (nova) | \u2014 (String) | `true` | `BigDecimal` gravado como `BSON::Decimal128` em vez de String |\n\nRefer\u00eancia: [MONGOID-5509](https://jira.mongodb.org/browse/MONGOID-5509) (deprecia\u00e7\u00e3o dessas flags na 8.1), [MONGOID-5760](https://jira.mongodb.org/browse/MONGOID-5760) (remo\u00e7\u00e3o na 9.0, PR #5811). As descri\u00e7\u00f5es acima seguem os coment\u00e1rios de `lib/mongoid/config.rb` (tag v8.0.13). A op\u00e7\u00e3o `use_activesupport_time_zone` (default `true`) tamb\u00e9m existe na 8.x e \u00e9 removida na 9.0.\n\nOutras flags presentes na s\u00e9rie 8.x que antecipam a 9.0:\n- `around_callbacks_for_embeds` (desde 8.0.7 / 8.1.x, default `true` na 8.x; `false` na 9.0) \u2014 d\u00e1 para testar com `false` ainda na 8.x.\n- `prevent_multiple_calls_of_embedded_callbacks` (default `false` na 8.x; `true` na 9.0).\n- `allow_bson5_decimal128` (8.0.6+ / 8.1.2+).\n\n### 8.2 \u26a0\ufe0f Decimal128 para `BigDecimal` (MONGOID-5212, MONGOID-5213, MONGOID-5381)\nCom `map_big_decimal_to_decimal128 = true` (default), campos `type: BigDecimal` passam a gravar `Decimal128`. Dados j\u00e1 gravados como String continuam sendo lidos, mas **queries por igualdade/range misturam tipos** (String vs Decimal128 n\u00e3o se comparam no servidor). Plano sugerido: subir com a flag em `false`, escrever migra\u00e7\u00e3o de dados, depois virar a flag.\n\n### 8.3 \u26a0\ufe0f Valores \"uncastable\" padronizados (MONGOID-2951 e relacionados)\nLer/gravar um valor que n\u00e3o converte para o tipo do campo passa a resultar em `nil` (em vez de `false`, exce\u00e7\u00e3o `NoMethodError`/`InvalidValue` ou comportamento indefinido). Casos: `Boolean` com string inv\u00e1lida, `Array/Hash/Set` com tipo errado, `Time/Date/DateTime` com valor inv\u00e1lido. `Regexp` persistido volta como `Regexp` (antes `BSON::Regexp::Raw`). `demongoize` de containers (Hash/Array) **n\u00e3o** mudou.\n\n### 8.4 \u26a0\ufe0f Ordem de callbacks (\u00e9pico MONGOID-4627)\n- **Referenciadas (`has_one/has_many`)**: na 8.0, o pai \u00e9 persistido e ent\u00e3o rodam os callbacks de save/create do filho; s\u00f3 depois `around_create_close`, `after_create`, `around_save_close`, `after_save` **do pai**. Na 7.x, `after_create` do pai rodava antes dos callbacks do filho.\n- **Embutidas (`embeds_one/embeds_many`)**: na 8.0, `before_*`/`around_*_open` do pai rodam primeiro, depois os callbacks do filho (open e close), depois os `close`/`after_*` do pai. Na 7.x, os callbacks de save/create do filho rodavam **antes** dos do pai.\n- Tabelas completas nas release notes. Tickets de bugs cobertos: MONGOID-5104 (`attribute_was` em `after_save`), MONGOID-5110, MONGOID-4476, MONGOID-4397, MONGOID-5089, MONGOID-5079.\n\n### 8.5 Dirty tracking compat\u00edvel com `ActiveModel::Dirty`\n- Em `after_*`, `attribute_was` retorna o **novo** valor (como no ActiveRecord). C\u00f3digo que usava `attribute_was` em `after_save` para pegar o valor anterior deve migrar para `*_previously_was`.\n- Novos: `*_previously_was`, `previously_new_record?`, `previously_persisted?`.\n- `attributes_before_type_cast` passa a se comportar como no AR (valores crus s\u00f3 at\u00e9 o save/reload; ao ler do banco, cont\u00e9m o valor como est\u00e1 no banco).\n\n### 8.6 \u26a0\ufe0f Outras remo\u00e7\u00f5es/mudan\u00e7as\n| Mudan\u00e7a | Detalhe |\n|---|---|\n| Tipo de campo desconhecido | `field :x, type: :bogus` levanta `Mongoid::Errors::InvalidFieldType` (antes virava `Object`) |\n| `any_of` com m\u00faltiplos argumentos | Vira condi\u00e7\u00e3o de topo (`$and` com novo `$or`) em vez de se juntar ao `$or` existente |\n| `pluck` em criteria embutida | Mant\u00e9m `nil`s |\n| `belongs_to` inv\u00e1lido | Com `optional: false`, pai inv\u00e1lido impede o save; use `validate:` para ajustar |\n| HABTM `push` | Atualiza associa\u00e7\u00e3o local sem reload |\n| `BSON::Binary` | Strings em campos `BSON::Binary` voltam como `BSON::Binary` |\n| `_ids` | Passa a ser cacheado |\n| Removidos | `geo_spacial` (use `geo_spatial`), `Document#to_a`, \u00edndice `:drop_dups`, `Mongoid::Errors::EagerLoad`, `Array#/Hash#update_values`, constantes `Extensions::Date::EPOCH`, `Extensions::Time::EPOCH`, `Factory::TYPE`, `:id_sort` em `first/last`, cache de criteria individual (use Query Cache) |\n| Depreciados | \u00edndices `geoHaystack`/`geoSearch` |\n| Novos | `tally`, `pick`, `find` com bloco (`Enumerable#find`) |\n\n### 8.7 Patches relevantes da s\u00e9rie 8.0\n- **8.0.6**: `Mongoid.allow_bson5_decimal128` (conviv\u00eancia com BSON 5) \u2014 [MONGOID-5650](https://jira.mongodb.org/browse/MONGOID-5650).\n- **8.0.7**: suporte a Rails 7.1.\n- **8.0.12**: \ud83d\udd12 MONGOID-5919 (`to_criteria`). **8.0.13**: \ud83d\udd12 CVEs 2026 \u2014 \u26a0\ufe0f com os mesmos novos defaults da 7.6.2 (`allow_unsafe_query_operators = false`, `allow_reparenting_via_nested_attributes = false`, `in_memory_regexp_time_limit = 5.0`). Se voc\u00ea j\u00e1 passou pela 7.6.2, nada novo aqui.\n- Bugs conhecidos corrigidos em 8.0.x/8.1.0 que podem aparecer logo ap\u00f3s o upgrade: MONGOID-5600 (\"Mongoid 8 breaks build\"), MONGOID-5417 (memory leak em `with()`), MONGOID-5433 (`Time#to_s(format)` depreciado no Rails 7), MONGOID-5435/5436.\n\n**A\u00e7\u00f5es**\n```ruby\n# Gemfile\ngem 'mongoid', '~&gt; 8.0.13'\ngem 'mongo', '&gt;= 2.19'   # 2.18 \u00e9 o m\u00ednimo do gemspec; 2.19+ para suporte completo a MongoDB 7.0\ngem 'bson', '&lt; 5'        # at\u00e9 chegar na 9.0 (ou use allow_bson5_decimal128 conscientemente)\n```\nA s\u00e9rie 8.0 **n\u00e3o tem** `config.load_defaults` (ele surge na 8.1); por isso as flags v\u00e3o expl\u00edcitas no `mongoid.yml`:\n```yaml\n# config/mongoid.yml \u2014 subir primeiro com comportamento 7.x, depois virar flag a flag\noptions:\n  broken_aggregables: true\n  broken_alias_handling: true\n  broken_and: true\n  broken_scoping: true\n  broken_updates: true\n  compare_time_by_ms: false\n  legacy_attributes: true\n  legacy_pluck_distinct: true\n  legacy_triple_equals: true\n  object_id_as_json_oid: true\n  overwrite_chained_operators: true\n  map_big_decimal_to_decimal128: false\n```\n\n---\n\n## 9. Etapa 2 \u2014 8.0 \u2192 8.1\n\n**Release notes:** [Mongoid 8.1 (rendered)](https://p-mongo.github.io/rendered-docs/mongoid/tutorial/release-notes/mongoid-8.1.html) \u00b7 [GitHub 8.1.0](https://github.com/mongodb/mongoid/releases/tag/v8.1.0).\n\n**Pr\u00e9-requisitos:** iguais \u00e0 8.0. Rails 7.1 exige 8.1.3+; Rails 7.2 exige 8.1.6+; Rails 8.0 exige 8.1.7+. Ruby 3.2 passa a ser oficial na 8.1 (Ruby 3.3 **n\u00e3o** \u00e9 oficial na 8.1).\n\n### 9.1 `config.load_defaults` (novo \u2014 use!)\n```ruby\nMongoid.configure do |config|\n  config.load_defaults 8.0   # mant\u00e9m defaults da 8.0; depois mude para 8.1\nend\n```\nO que cada valor faz na 8.1 (conferido em `lib/mongoid/config/defaults.rb`, tag v8.1.0):\n\n| `load_defaults` | Efeito |\n|---|---|\n| `7.3` | liga `broken_aggregables`, `broken_alias_handling`, `broken_and`, `broken_scoping`, `broken_updates`, `legacy_pluck_distinct`, `legacy_triple_equals`, `object_id_as_json_oid`; desliga `compare_time_by_ms`; + tudo de `7.4` |\n| `7.4` | liga `legacy_attributes`, `overwrite_chained_operators`; + tudo de `7.5` |\n| `7.5` | `map_big_decimal_to_decimal128 = false` |\n| `8.0` | nada (mant\u00e9m os defaults da gem; note que na 8.1 o default de `legacy_readonly` j\u00e1 \u00e9 `true`) |\n| `8.1` | `legacy_readonly = false` |\n\nA 9.0 passa a exigir `load_defaults &gt;= 8.0`, ent\u00e3o adotar isso aqui prepara o pr\u00f3ximo salto. Como a 8.1 aceita `load_defaults 7.5`, uma alternativa \u00e9 ir **7.6.2 \u2192 8.1.13 direto** com `load_defaults 7.5` (equivale a subir com o comportamento 7.5 da maioria das flags) e ent\u00e3o virar flag a flag \u2014 desde que voc\u00ea revise tamb\u00e9m as mudan\u00e7as sem flag da 8.0 (\u00a78.3\u2013\u00a78.6).\n\n### 9.2 Deprecia\u00e7\u00f5es (removidas na 9.0)\n- Todas as flags `broken_*`, `legacy_*`, `compare_time_by_ms`, `object_id_as_json_oid`, `overwrite_chained_operators`, `use_activesupport_time_zone` \u2014 [MONGOID-5509](https://jira.mongodb.org/browse/MONGOID-5509).\n- `Mongoid::QueryCache` \u2192 use `Mongo::QueryCache` (1 para 1; `clear_cache` \u2192 `clear`) \u2014 [MONGOID-5596](https://jira.mongodb.org/browse/MONGOID-5596).\n\n### 9.3 Mudan\u00e7as de comportamento com flag\n| Mudan\u00e7a | Flag | Detalhe |\n|---|---|---|\n| Documentos read-only | `legacy_readonly` (default `true` na 8.1) | Com `false`, documento s\u00f3 fica read-only via `readonly!`; proje\u00e7\u00f5es (`only/without`) deixam de torn\u00e1-lo read-only. `Mongoid::Errors::ReadonlyDocument` passa a ser levantado tamb\u00e9m em `save/update` (MONGOID-5474) |\n| Imutabilidade de `_id` | `immutable_ids` (novo; default `false` na 8.1, `true` na 9.0) | Levanta exce\u00e7\u00e3o ao alterar `_id` de documento persistido |\n| `upsert` | `upsert(replace: true/false)` \u2014 default `true` na 8.1, **`false` na 9.0** | Passe `replace:` explicitamente em todos os `upsert` agora ([MONGOID-5363](https://jira.mongodb.org/browse/MONGOID-5363), doc-fix [MONGOID-5629](https://jira.mongodb.org/browse/MONGOID-5629)) |\n\n### 9.4 Novidades \u00fateis (sem impacto de compatibilidade)\n`Criteria#load_async`; finders `first!/last!/second\u2026/third_to_last!` (MONGOID-5418); `attribute_before_last_save`, `saved_change_to_attribute(?)`, `will_save_change_to_attribute?`, `attribute_changed?(from:, to:)` (MONGOID-4403); `exists?(id | hash | false | nil)` (MONGOID-5100); `none_of` (MONGOID-5453); `save(touch: false)` (MONGOID-4979); `store_in` em subclasses (MONGOID-5226); `localize: :present` (MONGOID-5264); atribui\u00e7\u00e3o de Hash a `embedded_in`; API de time series collections (MONGOID-5370); `Mongoid.configure` sem argumento de bloco (MONGOID-5422); respeito a aliases em embedded nas queries (MONGOID-5281).\n\n### 9.5 Patches relevantes da s\u00e9rie 8.1\n8.1.2 (`allow_bson5_decimal128`), 8.1.3 (Rails 7.1), 8.1.6 (Rails 7.2), 8.1.7 (Rails 8.0 \u2014 MONGOID-5818), 8.1.12 (\ud83d\udd12 MONGOID-5919; backport MONGOID-4889; fix `Document#touch` MONGOID-5833; novo toolchain de CI), 8.1.13 (\ud83d\udd12 CVEs 2026 \u2014 mesmos novos defaults de seguran\u00e7a da 7.6.2/8.0.13). A s\u00e9rie 8.1 **n\u00e3o** ganhou suporte a Rails 8.1 (gemspec `activemodel &lt; 8.1` at\u00e9 8.1.13).\n\n**A\u00e7\u00f5es**\n```ruby\ngem 'mongoid', '~&gt; 8.1.13'\n```\n- `config.load_defaults 8.0` \u2192 testes \u2192 `config.load_defaults 8.1` \u2192 testes.\n- Substituir `Mongoid::QueryCache` por `Mongo::QueryCache`.\n- Adicionar `replace:` expl\u00edcito em todo `upsert`.\n- Testar com `legacy_readonly: false` e `immutable_ids: true` (ser\u00e3o os defaults da 9.0).\n- Testar tamb\u00e9m `around_callbacks_for_embeds: false` e `prevent_multiple_calls_of_embedded_callbacks: true` (defaults da 9.0, j\u00e1 existentes na 8.1).\n\n---\n\n## 10. Etapa 3 \u2014 8.1 \u2192 9.0\n\n**Release notes:** [Mongoid 9.0](https://mongodb.com/docs/mongoid/current/release-notes/mongoid-9.0) \u00b7 [An\u00fancio 9.0.0](https://mongodb.com/community/forums/t/mongoid-9-0-0-released/278593) \u00b7 [GitHub 9.0.0](https://github.com/mongodb/mongoid/releases?q=9.0.0).\n\n**Pr\u00e9-requisitos**\n- Ruby \u2265 2.7 ou JRuby \u2265 9.4 (drop de 2.6 e JRuby 9.3) \u2014 [MONGOID-5574](https://jira.mongodb.org/browse/MONGOID-5574) (PR #5768), MONGOID-5575.\n- Rails \u2265 6.0 (drop de 5.x).\n- Se usar `config.load_defaults`, m\u00ednimo **8.0** (7.5 e anteriores n\u00e3o s\u00e3o mais aceitos).\n- BSON 5 suportado oficialmente (MONGOID-5739, PR #5801).\n- Rails 7.2 exige 9.0.2+; Rails 8.0 e Ruby 3.3 exigem 9.0.3+ (MONGOID-5818, MONGOID-5792); Rails 8.1 exige 9.0.9+ (PR #6059); Ruby 4.0 exige 9.0.11+ (PR #6136).\n\n### 10.1 \u26a0\ufe0f Removidos (o app precisa estar livre disto antes)\n| Removido | Substituto | Ticket |\n|---|---|---|\n| Op\u00e7\u00f5es `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` | Nenhum \u2014 comportamento novo \u00e9 o \u00fanico | MONGOID-5760 (PR #5811) |\n| `Mongoid::QueryCache` | `Mongo::QueryCache` | MONGOID-5625 |\n| `Object#blank_criteria?` | \u2014 | MONGOID-5671 |\n| `Document#as_json(compact: true)` | `as_json.compact` | \u2014 |\n| `Mongoid::Errors::InvalidStorageParent` | \u2014 | \u2014 |\n| `Time.configured` | `Time.zone` / `Time.current` (defina `Time.zone` fora do Rails) | MONGOID-5676 |\n| Dezenas de extens\u00f5es internas em core classes (`Hash#__nested__`, `Hash#to_criteria`, `Object#__find_args__`, `Object#__mongoize_fk__`, `Object#do_or_do_not`, `Object#you_must`, `String#mongoid_id?`, `Symbol#mongoid_id?`, \u2026) | APIs p\u00fablicas | MONGOID-5653\u20265677 (lista completa no an\u00fancio 9.0.0) |\n\n### 10.2 \u26a0\ufe0f Mudan\u00e7as de comportamento (com ou sem flag)\n| Mudan\u00e7a | Flag para comportamento antigo | Ticket/nota |\n|---|---|---|\n| `around_*` callbacks em documentos **embutidos** s\u00e3o ignorados (com warning) | `Mongoid.around_callbacks_for_embeds = true` (n\u00e3o recomendado: `SystemStackError` com muitos embedded) | [MONGOID-5658](https://jira.mongodb.org/browse/MONGOID-5658) |\n| Callbacks de cada documento embutido rodam **uma \u00fanica vez** por opera\u00e7\u00e3o (antes, em embutidos aninhados em v\u00e1rios n\u00edveis, rodavam v\u00e1rias vezes) | `Mongoid.prevent_multiple_calls_of_embedded_callbacks = false` | MONGOID-5542 \u00b7 default `false` na 8.x \u2192 `true` na 9.0 |\n| `_id` imut\u00e1vel: alterar `_id` de doc persistido levanta exce\u00e7\u00e3o no save | `Mongoid::Config.immutable_ids = false` | \u2014 |\n| `upsert` faz **update** em vez de replace | `upsert(replace: true)` | MONGOID-5363 |\n| `embedded_in` default `touch: true` (outras associa\u00e7\u00f5es continuam `false`) | `embedded_in :x, touch: false` | \u2014 |\n| Documentos **lembram o contexto de persist\u00eancia** (client/database/collection) em que foram carregados/criados | `Mongoid.legacy_persistence_context_behavior = true` | \u2014 |\n| Embedded sempre usa o contexto do pai (`store_in` em embedded \u00e9 ignorado) | \u2014 | \u2014 |\n| `touch` limpa estado `changed?`/`changes` | \u2014 | \u2014 |\n| Acesso a campo exclu\u00eddo por `only/without` levanta `Mongoid::Errors::AttributeNotLoaded` (antes `ActiveModel::MissingAttributeError`); herda de `MongoidError` | \u2014 | MONGOID-5467 |\n| Query de `Time` com `Date` usa `Time.zone` (n\u00e3o o TZ do sistema) | \u2014 | \u2014 |\n| Hash em array atribu\u00eddo a campo vira `BSON::Document` | \u2014 | \u2014 |\n| `estimated_count` com default scope levanta `Mongoid::Errors::InvalidEstimatedCountScoping` | \u2014 | MONGOID-4960 |\n| BSON 5: campos `BSON::Decimal128` retornam `BigDecimal` | `Mongoid.allow_bson5_decimal128 = true` | MONGOID-5650 |\n| Aliases em op\u00e7\u00f5es de \u00edndice (`partial_filter_expression`, `weights`, `wildcard_projection`) s\u00e3o expandidos | \u2014 | \u2014 |\n| `for_js` depreciado (remo\u00e7\u00e3o na 10.0) | \u2014 | commit \"RUBY-5651 Deprecate for_js API\" (PR #5721) |\n\nNova flag na s\u00e9rie 9.0 (sem mudan\u00e7a de comportamento por default): `Mongoid.allow_scopes_to_unset_default_scope` (9.0.1+, default `false`; com `true`, named scopes podem remover o default scope \u2014 ser\u00e1 o default no Mongoid 10, MONGOID-5785).\n\n### 10.3 Novidades\nAPI de transa\u00e7\u00f5es `Model.transaction { }` / `doc.transaction { }` com `after_commit`/`after_rollback` (MONGOID-5530/5531/5708); `rails console --sandbox`; `Mongoid::RawValue` para pular coer\u00e7\u00e3o em queries (MONGOID-5408); CSFLE declarativo (MONGOID-5585/5587/5589/5592/5613/5615); `railsmdb`; gerador cria `config/initializers/mongoid.rb` (MONGOID-5439); `Mongoid.reconnect_clients` para forking servers; operadores `set_min/set_max/mul`; \u00edndices de Atlas Search (`Mongoid::SearchIndexable` + rake tasks); serializer de `BSON::ObjectId` para ActiveJob; `Mongoid::Threaded.get/set` (9.0.3); `create_indexes` passa a carregar todos os modelos (MONGOID-5547).\n\n**A\u00e7\u00f5es**\n```ruby\ngem 'mongoid', '~&gt; 9.0.12'\n```\n```ruby\nMongoid.configure do |config|\n  config.load_defaults 8.1        # obrigat\u00f3rio \u2265 8.0; depois avance para 9.0\nend\n```\nNa 9.0, `load_defaults 8.1` **j\u00e1 seta** (conferido em `lib/mongoid/config/defaults.rb`, tag v9.0.0):\n`immutable_ids = false`, `legacy_persistence_context_behavior = true`, `around_callbacks_for_embeds = true`, `prevent_multiple_calls_of_embedded_callbacks = false`. `load_defaults 8.0` adiciona `legacy_readonly = true`. Valores `7.x` levantam `ArgumentError`.\n\nO trabalho desta etapa \u00e9, portanto, ir de `load_defaults 8.1` para `load_defaults 9.0`, desligando cada uma dessas quatro flags individualmente (sobrescrevendo depois do `load_defaults`) e rodando os testes. Lembre que `upsert` sem `replace:` muda de comportamento independentemente de `load_defaults`, e que `allow_unsafe_query_operators` tamb\u00e9m n\u00e3o \u00e9 controlado por ele.\n- Remover do `mongoid.yml` todas as chaves da tabela 10.1 (a 9.0 falha/ignora chaves desconhecidas dependendo do caso \u2014 remova para evitar ru\u00eddo).\n- Grep: `Mongoid::QueryCache`, `Time.configured`, `MissingAttributeError`, `as_json(compact`, `blank_criteria?`, `for_js`, `store_in` dentro de classes embutidas, atribui\u00e7\u00f5es a `_id`.\n\n---\n\n## 11. Etapa 4 \u2014 patches 9.0.x com mudan\u00e7a de comportamento\n\nA s\u00e9rie 9.0 teve patches **n\u00e3o triviais**. Ao pular direto para 9.0.12, todos abaixo se aplicam.\n\n| Patch | Mudan\u00e7a | Flag/a\u00e7\u00e3o | Refer\u00eancia |\n|---|---|---|---|\n| 9.0.5 \u2192 9.0.7 | MONGOID-5822 (9.0.5) passou a disparar callbacks de filhos embutidos **n\u00e3o modificados** quando o pai mudava; a 9.0.7 **reverteu** por regress\u00e3o de performance (marcado como \"breaking\" nos release notes). **Para quem vem da 8.1 direto para 9.0.7+, o comportamento \u00e9 o mesmo que j\u00e1 tinha** \u2014 s\u00f3 afeta quem rodou 9.0.5/9.0.6. Se precisar que o filho reaja a mudan\u00e7as do pai, dispare explicitamente (exemplo nos release notes da 9.0.7). | \u2014 | MONGOID-5822 (PR #5923) \u2192 revert PR #6013 |\n| 9.0.7 | MONGOID-5827 (`allow_duplicate_index_declarations`) entrou e foi **revertido na pr\u00f3pria 9.0.7** \u2014 a op\u00e7\u00e3o s\u00f3 existe a partir da 9.1.0 | \u2014 | commits `a6c4478d2` / `9241add03` |\n| 9.0.8 | Fix `after_commit` em transa\u00e7\u00f5es; valida\u00e7\u00e3o de filhos profundamente aninhados; `reload` atualiza `new_record`; `transaction` retorna valor do bloco | \u2014 | MONGOID-5852, 5888, 5895, 5885 (PRs #5969, #6029, #6037, #6030) |\n| 9.0.9 (dez/2025) | **Suporte a Rails 8.1** (`activemodel &lt; 8.2`); `Decimal128` em dirty tracking; fix `pluck` em associa\u00e7\u00f5es | \u2014 | PR #6059, MONGOID-5890, MONGOID-5900 |\n| 9.0.10 (jan/2026) | \ud83d\udd12 Restringe `Criteria.from_hash`; vers\u00e3o do Rails no handshake; fix write conflict em embedded via `[]` | \u2014 | MONGOID-5919 (PR #6084), MONGOID-5864, MONGOID-5899 |\n| 9.0.11 (abr/2026) | **Ruby 4.0 oficial**; novas flags **com default legado** (`true`): `allow_reparenting_via_nested_attributes` e `autosave_saves_unchanged_documents`; dep `ostruct` | J\u00e1 defina ambas como `false` para antecipar 9.1 | Ruby 4.0: PR #6136 (backport de #6082); MONGOID-5930 (PR #6131), MONGOID-5751 (PR #6134) |\n| 9.0.12 (set/2026) | \ud83d\udd12 CVEs 2026-93758\u202693765: `allow_reparenting_via_nested_attributes` \u2192 **`false`**; `allow_unsafe_query_operators` \u2192 **`false`** (bloqueia `$where/$function/$accumulator`, `where(\"string\")` e operadores de topo fora da allowlist); `in_memory_regexp_time_limit` (5.0s); `NoEncryptionSchema` em CSFLE. Exceto pelo CSFLE (s\u00f3 9.x), **\u00e9 o mesmo conjunto que j\u00e1 entrou na 7.6.2/8.0.13/8.1.13** | Se precisar do comportamento antigo: `Mongoid.allow_unsafe_query_operators = true` / `allow_reparenting_via_nested_attributes = true` (avalie o risco) | MONGOID-5992, 5993, 5994, 5981, 5973, 5984, 5989 |\n\n---\n\n## 12. Etapa 5 \u2014 9.0 \u2192 9.1\n\n**Release notes:** [What's New 9.1 / 9.1.1](https://www.mongodb.com/docs/mongoid/current/reference/release-notes/) \u00b7 [GitHub 9.1.0](https://github.com/mongodb/mongoid/releases/tag/v9.1.0) \u00b7 [GitHub 9.1.1](https://github.com/mongodb/mongoid/releases/tag/v9.1.1).\n\n**Pr\u00e9-requisitos:** iguais a 9.0.11+ (`activemodel &gt;= 5.1, &lt; 8.2, != 7.0.0`; `mongo &gt;= 2.18`; Ruby \u2265 2.7, oficialmente at\u00e9 4.0; JRuby 9.4/10.0).\n\n**`load_defaults` na 9.1** (tag v9.1.1): `load_defaults 9.0` seta `autosave_saves_unchanged_documents = true` (e encadeia os valores de 8.1/8.0 descritos em \u00a710). **N\u00e3o** afeta `allow_reparenting_via_nested_attributes`, `allow_unsafe_query_operators`, `allow_duplicate_index_declarations` nem o formato de `cache_key` \u2014 esses precisam ser tratados explicitamente.\n\n### 12.1 \u26a0\ufe0f Defaults que mudam\n| Op\u00e7\u00e3o | 9.0.11 | 9.1 | Remo\u00e7\u00e3o |\n|---|---|---|---|\n| `Mongoid::Config.allow_reparenting_via_nested_attributes` | `true` | **`false`** (tamb\u00e9m em 9.0.12) | 10.0 (reparenting deixa de existir) \u2014 MONGOID-5930 (PR #6127) |\n| `Mongoid.autosave_saves_unchanged_documents` | `true` | **`false`** (autosave s\u00f3 salva sub\u00e1rvores com mudan\u00e7as; `after_save` dos filhos inalterados n\u00e3o roda) | 10.0 \u2014 MONGOID-5751 (PR #6133) |\n| `Mongoid.allow_unsafe_query_operators` | `false` (9.0.12) | `false` (9.1.1; n\u00e3o existe na 9.1.0) | \u2014 |\n| `cache_key` | com timestamp | **sem timestamp quando `cache_version` \u2260 nil** (timestamp vira a vers\u00e3o). Para o formato antigo: `def cache_version = nil` no modelo | MONGOID-4680 (PR #5874) |\n\n### 12.2 Novas flags (default preserva comportamento)\n| Op\u00e7\u00e3o | Default | Efeito |\n|---|---|---|\n| `Mongoid::Config.serializable_hash_with_legacy_only` | `true` | `serializable_hash(only: [])` retorna todas as chaves (legado). Flip para `false` em 10.0; flag removida em 11.0 \u2014 MONGOID-5892 (PR #6031) |\n| `Mongoid.isolation_level` | `:rails` (herda de `ActiveSupport::IsolatedExecutionState`) | `:thread` = comportamento thread-local anterior; `:fiber` \u2014 MONGOID-5882 (PR #6009). **Apps com Fibers/Async/Falcon**: validar |\n| `Mongoid.allow_short_circuit_queries` | `false` | `true`: `$in` de topo com `[]` retorna `[]` sem ir ao banco \u2014 MONGOID-5030 (PR #6138) |\n| `Mongoid.allow_duplicate_index_declarations` | `false` | Com `false` (comportamento que **j\u00e1 existia** antes da 9.1), declara\u00e7\u00f5es de \u00edndice \"superficialmente duplicadas\" (mesmas chaves, op\u00e7\u00f5es/nome diferentes) s\u00e3o ignoradas silenciosamente no cliente. Com `true`, todas s\u00e3o enviadas e o servidor valida/rejeita duplicatas \u2014 MONGOID-5827 (PR #5967) |\n\n### 12.3 Deprecia\u00e7\u00f5es\n- `Criteria#max_scan` \u2014 MONGOID-5720 (PR #6140).\n\n### 12.4 Novidades\n`Criteria#raw` / `raw(typed: true)` (MONGOID-5411, PR #5877); `Criteria#to_mql` (MONGOID-5752, PR #5895); `Criteria#eager_load` via aggregation pipeline \u2014 mais r\u00e1pido que `includes` para `has_many`/HABTM, cai para `includes` em embedded (MONGOID-5731, PR #6081; MONGOID-5922, PR #6122); `any?/one?/many?` via `count` (MONGOID-5910, PR #6069); Vector Search: `vector_field`, `vector_search_index`, `vector_search` (MONGOID-5898, PR #6129) e `auto_embed_field`/`auto_embed_search` (MONGOID-5923, PR #6130); `build_x(attrs, Klass)`/`create_x(attrs, Klass)` em `embeds_one/has_one/belongs_to` (MONGOID-5750, PR #6132); `Document#cache_version`; merge do touch do pai no insert do embedded (MONGOID-5867, PR #6128).\n\n**A\u00e7\u00f5es**\n```ruby\ngem 'mongoid', '~&gt; 9.1.1'\n```\n- Garantir que nenhum fluxo depende de reparenting via nested attributes nem de `after_save` em filhos inalterados com `autosave: true`.\n- Revisar chaves de cache (`cache_key`) se houver cache externo dependente do formato.\n- Se algum \u00edndice declarado \"some\" do `create_indexes` (j\u00e1 acontecia antes da 9.1), avaliar `allow_duplicate_index_declarations = true`.\n- Se o app usa Fibers (Falcon/async), validar `isolation_level`.\n\n---\n\n## 13. Preparando-se para o Mongoid 10\n\nRemo\u00e7\u00f5es/flips j\u00e1 anunciados nas release notes e PRs:\n\n| Item | An\u00fancio | A\u00e7\u00e3o agora |\n|---|---|---|\n| `for_js` | removido em 10.0 (MONGOID-5651) | Substituir por `where` com hash ou aggregation |\n| `allow_reparenting_via_nested_attributes` | removido em 10.0; reparenting deixa de ser poss\u00edvel | Rodar com `false` desde j\u00e1 |\n| `autosave_saves_unchanged_documents` | removido em 10.0 junto com o comportamento legado | Rodar com `false` desde j\u00e1 |\n| `serializable_hash_with_legacy_only` | default `false` em 10.0; removido em 11.0 | Rodar com `false` e ajustar chamadas `only: []` |\n| `Criteria#max_scan` | depreciado em 9.1 | Remover (o servidor tamb\u00e9m depreciou `maxScan`) |\n| `allow_scopes_to_unset_default_scope` | default `true` no 10.0 (MONGOID-5785) | Testar com `true` e revisar named scopes que interagem com `default_scope` |\n| `around_callbacks_for_embeds = true` | \"n\u00e3o recomendado\" | N\u00e3o depender |\n| `legacy_persistence_context_behavior`, `immutable_ids = false`, `allow_unsafe_query_operators = true` | flags de transi\u00e7\u00e3o (`allow_unsafe_query_operators` \u00e9 deliberadamente independente de `load_defaults`) | N\u00e3o depender |\n\n---\n\n## 14. Onde consultar: release notes, JIRA e PRs por tema\n\n### Documenta\u00e7\u00e3o oficial\n- Release notes narrativas (9.x, inclui 9.0.7/9.0.11/9.0.12/9.1/9.1.1): https://www.mongodb.com/docs/mongoid/current/reference/release-notes/\n- Mongoid 9.0: https://mongodb.com/docs/mongoid/current/release-notes/mongoid-9.0\n- Mongoid 8.0: https://www.mongodb.com/docs/mongoid/current/release-notes/mongoid-8.0/\n- Mongoid 8.1 (rendered do repo): https://p-mongo.github.io/rendered-docs/mongoid/tutorial/release-notes/mongoid-8.1.html\n- Compatibilidade: https://www.mongodb.com/docs/mongoid/current/compatibility \u00b7 fonte RST atual: https://github.com/mongodb/docs (diret\u00f3rio `content/drivers/source/includes/compatibility/mongoid/` e `.../ruby/`). O reposit\u00f3rio `mongodb/docs-mongoid` foi congelado em jul/2025 e est\u00e1 desatualizado.\n- Releases GitHub (lista de tickets/PRs por vers\u00e3o): https://github.com/mongodb/mongoid/releases\n- JIRA (lista completa de bugs por vers\u00e3o): https://jira.mongodb.org/projects/MONGOID\n- Alertas de seguran\u00e7a: https://www.mongodb.com/resources/products/alerts\n\n### Tickets e PRs chave, por tema\n\n| Tema | Vers\u00e3o | Refer\u00eancias |\n|---|---|---|\n| Ordem/sem\u00e2ntica de callbacks | 8.0 | \u00c9pico [MONGOID-4627](https://jira.mongodb.org/browse/MONGOID-4627); MONGOID-4639; MONGOID-5104, 5110, 4476, 4397 |\n| Callbacks em filhos inalterados | 9.0.5\u20139.0.7 / 9.1 | [MONGOID-5822](https://jira.mongodb.org/browse/MONGOID-5822) (9.0.5, PR #5923) \u2192 revert na 9.0.7 (PR #6013); MONGOID-5751 (PR #6133/#6134) |\n| `around_*` em embedded | 8.0.7+ (flag) / 9.0 (default) | [MONGOID-5658](https://jira.mongodb.org/browse/MONGOID-5658) |\n| Callbacks m\u00faltiplos em embedded aninhados | 8.x (flag) / 9.0 (default) | MONGOID-5542 |\n| BigDecimal/Decimal128 e BSON 5 | 8.0 / 8.0.6 / 9.0 | MONGOID-5212, 5213, 5381; [MONGOID-5650](https://jira.mongodb.org/browse/MONGOID-5650); MONGOID-5630; [MONGOID-5739](https://jira.mongodb.org/browse/MONGOID-5739) (PR #5801); MONGOID-5843, 5890 |\n| Feature flags 7.x (deprecia\u00e7\u00e3o \u2192 remo\u00e7\u00e3o) | 8.1 \u2192 9.0 | [MONGOID-5509](https://jira.mongodb.org/browse/MONGOID-5509); [MONGOID-5760](https://jira.mongodb.org/browse/MONGOID-5760) (PR #5811) |\n| `upsert` replace vs update | 8.1 / 9.0 | [MONGOID-5363](https://jira.mongodb.org/browse/MONGOID-5363); doc [MONGOID-5629](https://jira.mongodb.org/browse/MONGOID-5629) |\n| QueryCache | 8.1 / 9.0 | [MONGOID-5596](https://jira.mongodb.org/browse/MONGOID-5596) (deprecia); MONGOID-5625 (remove) |\n| Drop Ruby 2.6 / Rails 5 | 9.0 | [MONGOID-5574](https://jira.mongodb.org/browse/MONGOID-5574) (PR #5768); MONGOID-5575 (JRuby 9.4) |\n| Suporte a Rails 7.2 / 8.0 / 8.1 | 8.1.6+/9.0.2+ \u00b7 8.1.7+/9.0.3+ \u00b7 9.0.9+ | [MONGOID-5818](https://jira.mongodb.org/browse/MONGOID-5818); [PR #6059](https://github.com/mongodb/mongoid/pull/6059) |\n| Suporte a Ruby 3.3 / 4.0 | 9.0.3+ \u00b7 9.0.11+ | [MONGOID-5792](https://jira.mongodb.org/browse/MONGOID-5792) (n\u00e3o portado para 8.1); Ruby 4.0: PR #6136 |\n| S\u00e9rie 7.6 (driver atual) | 7.6.0 | [PR #6036](https://github.com/mongodb/mongoid/pull/6036) |\n| Unsafe reflection `from_hash`/`to_criteria` | 7.6.1 / 8.0.12 / 8.1.12 / 9.0.10 | [MONGOID-5919](https://jira.mongodb.org/browse/MONGOID-5919) (PRs #6084\u2013#6087) |\n| CVEs set/2026 | 7.6.2 / 8.0.13 / 8.1.13 / 9.0.12 / 9.1.1 | [MONGOID-5992](https://jira.mongodb.org/browse/MONGOID-5992), 5993, 5994, 5981, 5973 (todas as s\u00e9ries); 5984, [MONGOID-5989](https://jira.mongodb.org/browse/MONGOID-5989) (CSFLE, s\u00f3 9.x); pr\u00e9-requisito MONGOID-5939 |\n| Nested attributes / reparenting | 9.0.11 \u2192 9.1 | MONGOID-5930 (PRs #6127, #6131) |\n| `serializable_hash(only: [])` | 9.1 | MONGOID-5892 (PR #6031) |\n| Isolation level (threads/fibers) | 9.1 | MONGOID-5882 (PR #6009) |\n| \u00cdndices duplicados | 9.1 (entrou e foi revertido na 9.0.7) | MONGOID-5827 (PR #5967) |\n| `cache_key`/`cache_version` | 9.1 | MONGOID-4680 (PR #5874) |\n| `eager_load` | 9.1 | MONGOID-5731 (PR #6081), MONGOID-5922 (PR #6122), PR #6116 |\n| Transa\u00e7\u00f5es | 9.0 / 9.0.8 | MONGOID-5530, 5531, 5708 (PR #5767); MONGOID-5852, 5885 |\n| CSFLE | 9.0 / 9.0.12 | MONGOID-5585, 5587, 5589, 5592, 5613, 5615; 5984, 5989 |\n\n---\n\n## 15. Checklist de execu\u00e7\u00e3o\n\n```\n[ ] 0. Invent\u00e1rio: vers\u00f5es atuais de ruby, rails, mongoid, mongo, bson, MongoDB Server (e FCV)\n[ ] 0. Cobertura de testes em callbacks, dirty tracking, upsert, embedded, serializa\u00e7\u00e3o, nested attributes\n[ ] 0. Fixar no Gemfile: bson &lt; 5 ; mongo &lt; 2.26 se servidor 4.2 ; mongo &lt; 2.22 se Ruby 2.6\n[ ] 1. 7.5.4 \u2192 7.6.2 (seguran\u00e7a). Rodar testes.\n[ ]    1a. Tratar $where / where(\"js\") / $function / $accumulator (allow_unsafe_query_operators=false)\n[ ]    1b. Tratar nested attributes que movem filhos entre pais (allow_reparenting_via_nested_attributes=false)\n[ ]    1c. Tratar InMemoryRegexpTimeout em queries em mem\u00f3ria com regex de usu\u00e1rio\n[ ] 2. Ruby \u2192 3.1 (teto oficial da 7.x) ; Rails \u2192 7.0.x (\u2260 7.0.0)\n[ ] 2s. MongoDB Server \u2192 7.0, um major por vez + setFeatureCompatibilityVersion ; mongo \u2265 2.19\n[ ] 3. 7.6.2 \u2192 8.0.13 com todas as flags no valor 7.x. Rodar testes.\n[ ]    3a. Virar flag a flag (broken_*, legacy_*, compare_time_by_ms, object_id_as_json_oid,\n           overwrite_chained_operators). Rodar testes a cada flag.\n[ ]    3b. Decidir/migrar BigDecimal \u2192 Decimal128 (map_big_decimal_to_decimal128).\n[ ]    3c. Revisar callbacks que dependiam da ordem antiga; trocar attribute_was em after_* por *_previously_was.\n[ ]    3d. Corrigir tipos de campo inv\u00e1lidos, any_of encadeado, geo_spacial, Document#to_a etc.\n[ ] 4. Rails \u2192 7.1 (Mongoid \u2265 8.0.7)\n[ ] 5. 8.0.13 \u2192 8.1.13 ; config.load_defaults 8.0 \u2192 8.1\n[ ]    5a. Mongoid::QueryCache \u2192 Mongo::QueryCache\n[ ]    5b. upsert(replace: ...) expl\u00edcito em todos os usos\n[ ]    5c. Testar legacy_readonly: false, immutable_ids: true, around_callbacks_for_embeds: false,\n           prevent_multiple_calls_of_embedded_callbacks: true\n[ ] 6. Ruby \u2192 3.2 ; Rails \u2192 7.2 (8.1.6+) \u2192 8.0 (8.1.7+)   (Rails 8.1 e Ruby 3.3 s\u00f3 na 9.x)\n[ ] 7. 8.1.13 \u2192 9.0.12 ; load_defaults 8.1 ; remover chaves de config removidas\n[ ]    7a. Remover Time.configured, MissingAttributeError, as_json(compact:), blank_criteria?, for_js\n[ ]    7b. load_defaults 8.1 \u2192 9.0 desligando uma a uma: legacy_persistence_context_behavior, immutable_ids=false,\n           around_callbacks_for_embeds, prevent_multiple_calls_of_embedded_callbacks=false\n[ ]    7c. Validar: embedded_in touch: true, upsert update (replace: expl\u00edcito), store_in em embedded\n[ ]    7d. Flags de 9.0.11: autosave_saves_unchanged_documents=false (allow_reparenting j\u00e1 est\u00e1 false desde a 7.6.2)\n[ ]    7e. BSON 5: liberar o pin de bson e decidir allow_bson5_decimal128\n[ ] 7s. MongoDB Server 7.0 \u2192 8.0 ; mongo \u2265 2.21\n[ ] 8. Ruby \u2192 3.3 (9.0.3+) / 3.4 / 4.0 (9.0.11+) ; Rails \u2192 8.1 (9.0.9+)\n[ ] 9. 9.0.12 \u2192 9.1.1 ; validar cache_key, isolation_level, autosave (load_defaults 9.0 mant\u00e9m o legado)\n[ ] 10. Preparar para 10: serializable_hash_with_legacy_only = false, allow_scopes_to_unset_default_scope = true,\n        remover max_scan/for_js\n[ ] 11. (futuro) MongoDB Server 9.0 com mongo \u2265 2.26\n```\n", "url": "https://gist.github.com/afonso-sbf/009672f0e12db24bee017eb2a670d9e5"}], "metrics": {"as_of": "2026-11-13T00:58:21.283Z", "anchors": {"origin": {"timestamp": "2026-09-18T17:01:09.031Z", "date_only": false, "value": "2026-09-18T17:01:09.031Z", "kind": "milestone", "label": "Published", "source": "cvelistv5", "record": "CVE-2026-93765", "field": "cveMetadata.datePublished", "metric_role": "disclosure", "metric_basis": "recorded_event"}, "discovery": null, "report": null, "acknowledgement": null, "disclosure": {"timestamp": "2026-09-18T17:01:09.031Z", "date_only": false, "value": "2026-09-18T17:01:09.031Z", "kind": "milestone", "label": "Published", "source": "cvelistv5", "record": "CVE-2026-93765", "field": "cveMetadata.datePublished", "metric_role": "disclosure", "metric_basis": "recorded_event"}, "exploit_publication": null, "exploitation": null, "patch": null}, "vendor_response_time": {"available": false, "missing": ["start", "end"]}, "time_to_exploit": {"available": false, "missing": ["end"]}, "disclosure_to_exploit": {"available": false, "missing": ["end"]}, "disclosure_to_exploit_publication": {"available": false, "missing": ["end"]}, "time_to_patch": {"available": false, "missing": ["start", "end"]}, "total_time_to_patch": {"available": false, "missing": ["start", "end"]}, "disclosure_to_patch": {"available": false, "missing": ["end"]}, "time_unpatched": {"available": true, "seconds": 4780632.252489, "hours": 1327.9534034691665, "days": 55.331391811215276, "min_seconds": 4780632.252489, "max_seconds": 4780632.252489, "approximate": false, "ongoing": true, "order_known": true, "batch_listing": false, "end_before_start": false, "start": {"timestamp": "2026-09-18T17:01:09.031Z", "date_only": false, "value": "2026-09-18T17:01:09.031Z", "kind": "milestone", "label": "Published", "source": "cvelistv5", "record": "CVE-2026-93765", "field": "cveMetadata.datePublished", "metric_role": "disclosure", "metric_basis": "recorded_event"}, "end": {"timestamp": "2026-11-13T00:58:21.283Z", "date_only": false, "label": "As of", "source": "Calculation clock"}}, "exploitation_to_patch": {"available": false, "missing": ["start"]}, "exploit_publication_to_patch": {"available": false, "missing": ["start"]}}}
