Este tópico descreve as alterações de compatibilidade introduzidas no MongoDB 4.2.
Para consultar a documentação oficial sobre alterações de compatibilidade do MongoDB, acesse Documentação Legada.
Remoção do mecanismo de armazenamento MMAPv1
O MongoDB 4.2 remove o suporte ao mecanismo de armazenamento MMAPv1.
Caso sua instância utilize o mecanismo MMAPv1 no MongoDB 4.0, altere o mecanismo de armazenamento para WiredTiger antes de atualizá-la para o MongoDB 4.2.
Opções específicas do MMAPv1
O MongoDB 4.2 remove as seguintes opções específicas do MMAPv1:
|
Opção removida |
Linha de comando removida |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A partir do MongoDB 4.2, as opções e linhas de comando anteriores tornaram-se obsoletas. Se você utiliza o WiredTiger, remova as opções específicas do MMAPv1.
Parâmetros específicos do MMAPv1
O MongoDB 4.2 remove os seguintes parâmetros específicos do MMAPv1:
newCollectionsUsePowerOf2SizesreplIndexPrefetch
Comando específico do MMAPv1
O MongoDB 4.2 remove o comando touch, que era específico do MMAPv1.
Opções específicas do MMAPv1 para comandos e métodos
As seguintes opções específicas do MMAPv1 foram removidas no MongoDB 4.2:
noPaddingeusePowerOf2Sizesdo comandocollMod.verbosedo comandocollStats.flagsdo comandocreate.paddingFactor,paddingBytesepreservePaddingdo comandodb.createCollection().
O MongoDB 4.2 ignora a opção async, específica do MMAPv1, no comando fsync.
Remoção ou descontinuação de comandos e métodos
Descontinuação do comando group
A partir do MongoDB 4.2, o comando group (descontinuado no MongoDB 3.4) e sua função auxiliar do mongo shell db.collection.group() tornaram-se obsoletos.
Utilize db.collection.aggregate() juntamente com o estágio $group como alternativa.
Descontinuação do comando eval
O comando eval foi descontinuado a partir do MongoDB 4.2 (originalmente descontinuado no MongoDB 3.0).
As funções auxiliares do mongo shell db.eval() e db.collection.copyTo() só podem ser executadas quando conectadas a uma instância rodando o MongoDB 4.0 ou versões anteriores.
Descontinuação dos comandos copydb e clone
Os comandos copydb e clone tornaram-se obsoletos a partir do MongoDB 4.2. As funções auxiliares do mongo shell db.copyDatabase() e db.cloneDatabase() só funcionam em conexões com instâncias do MongoDB 4.0 ou anteriores.
Como alternativa, utilize o mongodump e o mongorestore (com as opções --nsFrom e --nsTo do mongorestore) ou um driver para criar um script.
Por exemplo, para copiar o banco de dados test para o banco de dados examples na mesma instância, siga os passos abaixo:
-
Execute o
mongodumppara exportar o banco de dadostestpara um arquivo compactado chamadomongodump-test-db.mongodump --archive="mongodump-test-db" --db=test -
Utilize o
mongorestorecom os parâmetros--nsFrome--nsTopara restaurar os dados do arquivo compactado.mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
Adicione outros parâmetros conforme necessário, como --uri, --host e --username.
Outra opção é usar o mongodump para enviar a saída do banco de dados test diretamente para o fluxo de saída padrão e canalizá-la (pipe) para o mongorestore, eliminando a necessidade de um arquivo intermediário.
mongodump --archive --db=test | mongorestore --archive --nsFrom='test.*' --nsTo='examples.*'
Descontinuação do comando parallelCollectionScan
O comando parallelCollectionScan foi descontinuado a partir do MongoDB 4.2.
Remoção da opção maxScan
A opção maxScan foi removida do comando find e da função auxiliar do mongo shell cursor.maxScan() no MongoDB 4.2. Utilize a opção maxTimeMS do comando find ou o método cursor.maxTimeMS() do mongo shell como substituto.
Descontinuação do comando geoNear
O comando geoNear tornou-se obsoleto a partir do MongoDB 4.2. Use o estágio de agregação $geoNear em seu lugar.
As opções do estágio $geoNear são semelhantes às do comando descontinuado geoNear, com as seguintes exceções:
-
A saída do comando descontinuado
geoNearincluía o campodiscom informações de distância.No estágio
$geoNear, especifique o nome do campo de distância emdistanceField. -
O comando descontinuado
geoNearaceitava um valor booleano na opçãoincludeLocspara incluir o campoloc.No estágio
$geoNear, especifique o nome do campo de localização emincludeLocs. -
A saída do comando descontinuado
geoNearincluíaavgDistanceemaxDistance.É possível obter
avgDistanceemaxDistanceusando o pipeline de agregação. Especificamente, inclua o estágiogroupapós o estágiogeoNearpara calcular esses valores.db.places.aggregate([ { $geoNear: { near: <...>, distanceField: "dis", includeLocs: "loc", spherical: true, ... } }, { $group: { _id: null, objectsLoaded: { $sum: 1 }, maxDistance: { $max: "$dis" }, avgDistance: { $avg: "$dis" } } } ])
Descontinuação do comando repairDatabase
A partir do MongoDB 4.2, o comando repairDatabase, a função auxiliar do mongo shell db.repairDatabase() e a permissão repairDatabase tornaram-se obsoletos.
Alternativas disponíveis:
Para compactar dados em um mongod, utilize o comando
compact.Para reconstruir índices em uma instância standalone, execute o comando
reIndexou sua função auxiliardb.collection.reIndex().Para reparar dados de uma instância standalone, use
mongod --repair.
Descontinuação do comando getPrevError
O comando getPrevError e sua função auxiliar do mongo shell db.getPrevError() foram descontinuados a partir do MongoDB 4.2.
Descontinuação do comando cloneCollection
O comando cloneCollection e sua função auxiliar do mongo shell db.cloneCollection() tornaram-se obsoletos a partir do MongoDB 4.2.
Utilize os comandos mongoexport e mongoimport ou um driver para escrever um script como alternativa.
Descontinuação dos comandos PlanCache
Os seguintes itens foram descontinuados a partir do MongoDB 4.2:
-
O método
PlanCache.getPlansByQuery()e o comandoplanCacheListPlans.Para obter os planos de consulta em cache para um formato (shape), utilize o estágio de agregação
$planCacheStats. -
O método
PlanCache.listQueryShapes()e o comandoplanCacheListQueryShapes.Para listar os formatos de consulta em cache, utilize o estágio de agregação
$planCacheStats.
Agregação
Limites do estágio $out
$out e views
O pipeline de definição de uma view não pode conter o estágio $out. Caso exista uma view contendo o estágio $out, não será possível criar outra view a partir dela.
Para views existentes que contenham o estágio $out, exclua e recrie a view sem esse estágio ou substitua a definição da view por um novo pipeline que não inclua o $out.
$out e $lookup
O estágio $lookup não pode incluir o estágio $out em seus pipelines aninhados.
$out e níveis de read concern
Não é permitido usar o estágio $out em conjunto com o nível de read concern "linearizable".
$out e o comando explain
Se o pipeline de agregação atual contiver o estágio $out, não será possível executar a função auxiliar db.collection.explain() ou o comando explain nos modos executionStats ou allPlansExecution.
Nesse cenário, para visualizar informações de executionStats ou allPlansExecution, execute o explain sem o estágio out para obter a saída referente aos estágios anteriores.
Como alternativa, execute o explain no modo queryPlanner no pipeline de agregação que contém o estágio $out.
$out e o nível de read concern "majority"
A partir do MongoDB 4.2, é possível especificar o nível de read concern "majority" para operações de agregação que contenham o estágio $out.
Remoção das opções limit e num do $geoNear
O MongoDB 4.2 removeu as opções limit e num do $geoNear, bem como o limite padrão de 100 documentos. Para limitar os resultados do $geoNear, combine o estágio $geoNear com o estágio $limit.
Por exemplo, a agregação abaixo, onde o estágio $geoNear inclui a opção num, não é mais válida no MongoDB 4.2.
db.places.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
distanceField: "distance",
num: 5, // Not supported in 4.2
spherical: true
}
}
])
Reescreva o comando de agregação no seguinte formato:
db.places.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
distanceField: "distance",
spherical: true
}
},
{ $limit: 5 }
])
Transações
Mudanças importantes a partir do MongoDB 4.2:
Não é permitido especificar
killCursorscomo a primeira operação de uma transação, nem gravar dados em coleções com limite de tamanho (capped collections) dentro de uma transação. No entanto, a leitura de dados dessas coleções ainda é permitida.O limite de tamanho total de transação de 16 MB foi removido. O MongoDB 4.2 cria quantas entradas de oplog forem necessárias para encapsular todas as operações de escrita de uma transação. Versões anteriores criavam uma única entrada para todas as escritas, o que impunha o limite de 16 MB.
Change streams
Disponibilidade
A partir do MongoDB 4.2, os change streams estão disponíveis independentemente de o nível de read concern "majority" oferecer suporte a eles.
Antes do MongoDB 4.2, os change streams só estavam disponíveis se o suporte ao read concern "majority" estivesse ativado (configuração padrão).
Collation padrão
No MongoDB 4.2, os change streams usam comparações binárias simples, a menos que uma collation explícita seja fornecida. Em versões anteriores, os change streams criados para uma única coleção via db.collection.watch() herdavam a collation padrão da coleção.
Modificação do token de retomada
Se um pipeline de agregação de change stream modificar o campo _id de um evento a partir do MongoDB 4.2, uma exceção será lançada.
Aumento de descritores de arquivo para conexões de entrada
A partir do MongoDB 4.2, cada conexão de entrada para uma instância mongod ou mongos requer dois descritores de arquivo. Antes dessa versão, era necessário apenas um descritor.
Antes de atualizar do MongoDB 4.0 para o 4.2, talvez seja necessário aumentar o valor da configuração open files do ulimit (-n).
Ferramentas do MongoDB
Modo FIPS
A opção --sslFIPSMode foi removida dos seguintes programas a partir do MongoDB 4.2:
mongodump
mongoexport
mongofiles
mongoimport
mongorestore
mongostat
mongotop
Esses programas utilizam conexões compatíveis com FIPS automaticamente quando o modo FIPS está habilitado nas instâncias mongod e mongos.
Extended JSON v2
Ferramenta | Descrição |
bsondump | Utiliza o formato Extended JSON v2.0 (Modo Canônico). |
mongodump | Utiliza o formato Extended JSON v2.0 (Modo Canônico) para saída de metadados. Requer mongorestore V4.2 ou superior para suportar o formato Extended JSON v2.0 (Modo Canônico ou Relaxado). Nota Em geral, utilize versões correspondentes do mongodump e mongorestore. Para restaurar arquivos de dados criados por uma versão específica do mongodump, use a versão correspondente do mongorestore. |
mongoexport | Gera dados de saída no formato Extended JSON v2.0 (Modo Relaxado) por padrão. Se |
mongoimport | Espera que os dados importados estejam no formato Extended JSON v2.0 (Modo Canônico ou Relaxado) por padrão. Se a opção Nota Em geral, as versões do mongoexport e mongoimport devem ser consistentes. Para importar dados criados pelo mongoexport, utilize a versão correspondente do mongoimport. |
**Opção --query**
A partir do MongoDB 4.2, a opção --query para mongodump e mongoexport deve estar no formato Extended JSON v2 (Modo Relaxado ou Estrito), incluindo nomes de campos e operadores entre aspas. Exemplo:
mongoexport -d=test -c=records -q='{ "a": { "$gte": 3 }, "date": { "$lt": { "$date": "2016-01-01T00:00:00.000Z" } } }' --out=exportdir/myRecords.json
Antes do MongoDB 4.2, a opção --query usava o formato Extended JSON v1, onde nomes de campos e operadores não precisavam estar entre aspas.
mongoexport -d=test -c=records -q='{ a: { $gte: 3 }, date: { $lt: { "$date": "2016-01-01T00:00:00.000Z" } } }' --out=exportdir/myRecords.json
Alterações de estado do replica set
Step down do primário
A partir do MongoDB 4.2, o comando replSetStepDown (ou replSetReconfig que cause um step down) não fecha mais todas as conexões de clientes. Contudo, operações de escrita ainda em andamento são encerradas.
Antes do MongoDB 4.0, o replSetStepDown fechava todas as conexões de clientes durante o step down.
Estado ROLLBACK
Quando um membro entra no estado ROLLBACK a partir do MongoDB 4.2, todas as operações de usuário são encerradas.
Escritas repetíveis habilitadas por padrão em drivers compatíveis com MongoDB 4.2
O suporte a escritas repetíveis (retryable writes) existe desde o MongoDB 3.6, mas a maioria dos drivers oficiais compatíveis com 3.6 e 4.0 desabilitava esse recurso por padrão. Nesses drivers, era necessário especificar a opção retryWrites=true nas strings de conexão para ativar o recurso.
Drivers oficiais compatíveis com MongoDB 4.2 e posteriores habilitam escritas repetíveis por padrão. Aplicações atualizadas para drivers compatíveis com 4.2 que necessitem desse recurso podem omitir a opção retryWrites=true. Para desativar as escritas repetíveis, inclua explicitamente a opção retryWrites=false nas strings de conexão.
O banco de dados local não suporta escritas repetíveis. Aplicações que gravam nesse banco encontrarão erros de escrita ao atualizar para drivers compatíveis com MongoDB 4.2, a menos que as escritas repetíveis sejam explicitamente desabilitadas.
Alterações gerais
Índices
Limites no comando reIndex
O MongoDB 4.2 impõe limites mais restritivos ao comando reIndex e à função db.collection.reIndex(), proibindo sua execução em instâncias mongos.
Limites em db.collection.dropIndex()
Não utilize db.collection.dropIndex() para excluir todos os índices que não sejam _id. Use db.collection.dropIndexes() em vez disso.
Mensagem de erro ao criar índices duplicados
A partir do MongoDB 4.2, o comando createIndexes e as funções auxiliares do mongo shell db.collection.createIndex() e db.collection.createIndexes() retornam erro se você tentar criar um índice já existente, mas com um nome diferente.
{
"ok" : 0,
"errmsg" : "Index with name: x_1 already exists with a different name",
"code" : 85,
"codeName" : "IndexOptionsConflict"
}
No MongoDB 4.0 e versões anteriores, essa operação não recriava o índice, mas retornava uma mensagem com as seguintes informações:
{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
Índices hash em PowerPC
Para índices hash, o MongoDB 4.2 garante que o valor hash do ponto flutuante 263 em plataformas PowerPC seja consistente com outras plataformas. Em versões anteriores, havia inconsistência nesse valor.
Embora índices hash em campos com valores de ponto flutuante maiores que 253 não sejam configurações suportadas, clientes ainda podem inserir documentos onde o campo indexado tenha o valor 263.
Se uma instância de cluster sharded executando MongoDB 4.0 em PowerPC possuir uma chave de shard com valor hash 263, considere cuidadosamente os impactos antes de atualizar para o MongoDB 4.2.
min()/max()
Ao especificar min()/max() em uma operação db.collection.find() a partir do MongoDB 4.2, é obrigatório especificar explicitamente um índice para min()/max(), exceto se a consulta find() for uma condição de igualdade no campo _id { _id: }.
Da mesma forma, ao especificar min/max no comando find, você deve fornecer explicitamente o hint para o índice min/max.
Antes do MongoDB 4.0, a especificação explícita do índice min()/max() era opcional. Sem um hint explícito nessas versões, o MongoDB selecionava um índice com base nos limites do índice. Porém, se múltiplos índices existissem nos mesmos campos com ordens de classificação diferentes, a seleção poderia ser ambígua.
CurrentOp
Ao relatar operações "getmore", o estágio de agregação $currentOp, o comando currentOp e db.currentOp() agora retornam o campo originatingCommand como um campo aninhado do novo campo cursor. Antes do MongoDB 4.2, originatingCommand era um campo de nível superior no documento "getmore".
Status do servidor
As métricas opcounters e opcountersRepl retornadas por serverStatus e db.serverStatus agora são inteiros de 64 bits (NumberLong) em vez de inteiros de 32 bits (NumberInt).
Logging
-
Ao registrar logs no syslog, o formato do texto da mensagem agora inclui informações do componente. Exemplo:
... ACCESS [repl writer worker 5] Unsupported modification to roles collection ...Em versões anteriores ao MongoDB 4.2, as mensagens do syslog não incluíam essas informações. Exemplo:
... [repl writer worker 1] Unsupported modification to roles collection ... Comandos de recuperação de log no MongoDB 4.2 truncam eventos com mais de 1.024 caracteres. Em versões anteriores, o truncamento ocorria após 512 caracteres.
-
O MongoDB 4.2 registra o nível de log de depuração específico. Por exemplo, se o nível for 2, ele registra D2.
Antes dessa versão, as mensagens de log especificavam apenas D como nível de depuração.
Protocolo wire
O MongoDB 4.2 deixou de suportar OP_COMMAND e o protocolo de escrita correspondente OP_COMMANDREPLY.
Alterações em Killcursors
Transações
Não é mais permitido especificar killCursors como a primeira operação de uma transação a partir do MongoDB 4.2.
Permissões
A partir do MongoDB 4.2, você sempre pode encerrar seus próprios cursores, independentemente de ter a permissão killCursors. Portanto, essa permissão perdeu o efeito no MongoDB 4.2 e versões posteriores.
Nas versões 3.6.3 a 4.0.x, a permissão killCursors era necessária para encerrar cursores quando o controle de acesso estava habilitado.
Remoção do parâmetro AsyncRequestsSenderUseBaton
O parâmetro AsyncRequestsSenderUseBaton foi removido no MongoDB 4.2, e a melhoria de desempenho controlada por ele agora está sempre ativa.
Validação mais rigorosa da sintaxe de count
O MongoDB 4.2 implementa validação mais rigorosa para nomes de opções no comando count. Se um nome de opção desconhecido for especificado, o comando retornará erro.
Versões anteriores ignoravam nomes de opções inválidos.
Sessões causalmente consistentes
Os seguintes comandos deixaram de suportar afterClusterTime a partir do MongoDB 4.2:
Comando
dbHashComando
mapReduceComando
validate
Consequentemente, essas operações não podem ser associadas a sessões causalmente consistentes.
Remoção da métrica fastmodinsert
A métrica descontinuada fastmodinsert foi removida de várias saídas no MongoDB 4.2, incluindo o executionStats do explain e a saída do profiler.
Map-Reduce
Os seguintes itens tornaram-se obsoletos a partir do MongoDB 4.2:
A opção
map-reducepara criar uma coleção sharded e o suporte ao uso da opção sharded para map-reduce. Para gerar saída em uma coleção sharded, crie-a previamente. A substituição de uma coleção sharded existente também foi descontinuada.Especificação explícita da opção
nonAtomic: falsepara map-reduce.
Status do balancer e auto splitting
Mudanças no MongoDB 4.2:
-
O comando
balancerStarte os métodos auxiliares do mongo shellsh.startBalancer()esh.setBalancerState(true)também ativam o auto splitting.Para desativar o auto splitting, utilize
sh.disableAutoSplit(). -
O comando
balancerStope os métodos auxiliaressh.stopBalancer()esh.setBalancerState(false)também desativam o auto splitting.Para ativar o auto splitting, utilize
sh.enableAutoSplit().
Os métodos sh.enableBalancing(namespace) e sh.disableBalancing(namespace) não afetam mais o auto splitting.
Relatórios de diagnóstico de locks
O MongoDB 4.2 passou a relatar informações sobre o lock ReplicationStateTransition.
Além disso, as informações de lock do ParallelBatchWriterMode agora são separadas das informações de lock global. Versões anteriores relatavam o ParallelBatchWriterMode como parte do lock global.
Para operações que relatam informações de lock, consulte:
O comando
serverStatuse o métododb.serverStatus().O estágio de pipeline de agregação
$currentOp, o comandocurrentOpe o métododb.currentOp().
Validação de argumentos de consulta, ordenação ou projeção para findAndModify
A partir do MongoDB 4.2 (incluindo V4.0.12+ e 3.6.14+), o comando findAndModify e seus métodos associados do mongo shell retornam erro quando o argumento de consulta, ordenação ou projeção especificado não é um documento.
Antes do MongoDB 4.2, a operação considerava argumentos de consulta ou ordenação não documentais como um documento vazio {}.
DropDatabase e movePrimary
Novos requisitos a partir do MongoDB 4.2:
-
Se você excluir um banco de dados e criar outro com o mesmo nome, execute uma das seguintes operações:
Reinicie todas as instâncias mongos e membros do shard, ou
Execute o comando
flushRouterConfigem todas as instâncias mongos e membros do shard antes de ler ou gravar no banco criado.
-
Se utilizar o comando movePrimary para mover coleções não sharded, execute uma das seguintes operações:
Reinicie todas as instâncias mongos e membros do shard, ou
Execute o comando
flushRouterConfigem todas as instâncias mongos e membros do shard antes de ler ou gravar nessas coleções.
Isso garante que o mongos e os membros do shard limpem seus caches de metadados. Caso contrário, leituras podem perder dados e gravações podem ser direcionadas ao shard incorreto, exigindo intervenção manual para correção.
Antes do MongoDB 4.2, bastava reiniciar as instâncias mongos ou executar o comando flushRouterConfig apenas nelas.
Remoção das coleções system.indexes e system.namespaces
As coleções system.indexes e system.namespaces (descontinuadas no MongoDB 3.0) foram removidas no MongoDB 4.2.
Com essa remoção, as funções integradas clusterManager, clusterMonitor, dbAdmin, read, restore e outras funções que herdam delas não possuem mais permissões para acessar as coleções system.indexes e system.namespaces.
Necessidade de limpar diretórios de dados ao fazer downgrade de arbiter
Os arquivos de dados do arbiter no MongoDB 4.2 são incompatíveis com o MongoDB 4.0. Para fazer downgrade de 4.2 para 4.0, exclua primeiro os arquivos de dados do arbiter. O uso de arquivos de dados do 4.2 para executar um arbiter no 4.0 pode causar erros.
Coleções sharded e substituição de documentos
Comportamentos alterados no MongoDB 4.2:
Uma operação de substituição de documento, como
replaceOne()ouupdate()(quando usada com documento de substituição), tenta primeiro localizar um shard usando o filtro de consulta. Se falhar, tenta utilizar o documento de substituição. Antes do 4.2, a tentativa era feita apenas com o documento de substituição.O método
save()foi descontinuado. UtilizeinsertOne()oureplaceOne(). O métodosave()não funciona em coleções sharded cuja chave de shard não seja_id, resultando em erro.Para operações de substituição com
upsert: trueem coleções sharded, o filtro deve incluir uma correspondência exata na chave de shard da coleção.
Compatibilidade de recursos do MongoDB 4.2
Alguns recursos do MongoDB 4.2 exigem não apenas os binários 4.2, mas também a versão de compatibilidade de recursos (fCV) definida como 4.2. Recursos afetados:
Transações distribuídas.
Remoção dos limites de comprimento de chave de índice para versões com fCV definido como 4.2+. Além disso, o parâmetro
failIndexKeyTooLongnão tem efeito nessas versões, aplicando-se apenas ao MongoDB 2.6 a 4.0.Remoção dos limites de comprimento de nome de índice para versões com fCV definido como 4.2+.
Novo formato interno para índices únicos, aplicável a todos os índices únicos existentes, recém-criados ou reconstruídos.
A partir do MongoDB 4.2, não é mais possível usar
type:0como sinônimo deexists:false.Introdução de índices wildcard para suportar cargas de trabalho com consultas em campos personalizados ou variados dentro de uma coleção.