Este tópico descreve as alterações de compatibilidade no MongoDB 3,4.
Para obter mais informações sobre as alterações oficiais de compatibilidade do MongoDB, consulte o site do MongoDB.
Alterações em instâncias de cluster com sharding
Funções explícitas de membros
Em uma instância de cluster com sharding que executa o MongoDB 3,4, todas as instâncias mongod nos shards devem declarar explicitamente sua função como shardsvr por meio de um dos seguintes métodos:
Arquivo de configuração: especifique
sharding.clusterRole: shardsvr.Linha de comando: use a opção
--shardsvr.
A porta padrão para instâncias mongod com a função shardsvr é 27018. Para usar uma porta diferente, defina a opção de configuração net.port ou o parâmetro --port com o número da porta desejada.
Limites de compatibilidade
Uma instância mongos que executa o MongoDB 3,4 não consegue se conectar a uma instância mongod que executa uma versão anterior.
Remoção de opções de configuração
O MongoDB 3,4 remove as seguintes opções de configuração do mongos:
-
Configuração de tamanho de chunk:
Opção de arquivo de configuração
sharding.chunkSize.Opção de linha de comando
--chunkSize.
-
Configuração de divisão automática:
Opção de arquivo de configuração
sharding.autoSplit.Opção de linha de comando
--noAutoSplit.
Descontinuação dos servidores de configuração SCCC
A partir do MongoDB 3,4, instâncias de cluster com sharding deixaram de suportar instâncias mongod espelhadas (SCCC) como servidores de configuração. Esse modo foi descontinuado no MongoDB 3.2.
O servidor de configuração deve ser implantado no modo de replica set (CSRS). Para atualizar sua instância de cluster com sharding para o MongoDB 3,4, o servidor de configuração precisa atender aos seguintes requisitos:
Deve estar em execução no modo CSRS.
Caso esteja no modo SCCC, é possível convertê-lo para o modo CSRS.
Compatibilidade de renomeação de coleções com a sincronização inicial
Se uma coleção usada como source de sincronização for renomeada durante a sincronização inicial, o processo é interrompido e reiniciado, evitando riscos de corrupção de dados. Para mais informações, consulte SERVER-26117.
As operações a seguir envolvem a renomeação de coleções:
O comando
renameCollection: como o métododb.collection.renameCollection().O estágio
$outem uma operação de agregação, como ao usar o métododb.collection.aggregate()ou o comandoaggregatecom o estágio$out.A opção
outno MapReduce, como ao usar o métododb.collection.mapReduce()ou o comandomapReducecom a opçãooutespecificada.O comando
convertToCapped, utilizado para converter uma coleção comum em uma coleção capped.
Ao atualizar do MongoDB 3.2.11 ou versões anteriores para o 3,4, a sincronização inicial pode falhar caso encontre uma operação de renomeação de coleção.
Antes do MongoDB v3.2.11, o processo de sincronização inicial continuava ao encontrar uma operação de renomeação de coleção que poderia corromper dados. Para mais informações, consulte SERVER-4941.
Operações descontinuadas
Comando group
A partir do MongoDB 3,4, o comando group e o método do mongo shell db.collection.group() foram descontinuados. Use db.collection.aggregate() ou db.collection.mapReduce() como alternativa.
Comando aggregate sem informações de cursor
A partir do MongoDB 3.6, a saída do comando aggregate deve incluir um cursor na opção cursor, a menos que a opção explain seja especificada para análise do plano de execução.
Para indicar um cursor com o tamanho de lote padrão, especifique cursor:
{}.Para indicar um cursor com tamanho de lote não padrão, use
cursor: { batchSize: <num> }.
Especificações de coleções e índices
Validação de opções de coleção
A partir do MongoDB 3,4, o comando create e uma operação db.createCollection() realizam uma validação mais rigorosa das opções de coleção. Use somente opções válidas suportadas por create ou db.createCollection().
Por exemplo, a operação a seguir não é mais válida porque inclui a opção inválida cappedtypo:
db.createCollection( "myCappedCollection", { cappedtypo: true, size: 5242880 } )
Validação de especificação de índices
A partir do MongoDB 3,4, o comando createIndexes e o método db.collection.createIndex() realizam uma validação mais rigorosa na criação de índices. Essa validação não se aplica a índices já existentes. As seguintes regras de validação são aplicadas:
-
Certifique-se de que o
valueno padrão de chave de índicekey: valueseja válido. Valores permitidos:Valor
Descrição
Number > 0
Para índices ascendentes.
Number < 0
Para índices descendentes.
String
Para tipos de índice especiais, somente "text", "2dsphere", "2d" e "hashed" são permitidos.
Por exemplo, as operações a seguir não são mais válidas:
db.collection.createIndex( { x: 0 } ); db.collection.createIndex( { y: "text2d" } ); db.collection.createIndex( { z: NaN } ); db.collection.createIndex( { x: 1, unique: true } ) -
Certifique-se de que as opções de índice especificadas sejam válidas. Antes do MongoDB 3,4, opções de índice inválidas eram ignoradas. A partir do MongoDB 3,4, o MongoDB reporta um erro caso opções de índice inválidas sejam especificadas. Por exemplo, as operações a seguir não são mais válidas:
db.collection.createIndex( { y: 1 }, { uniques2: true} ); db.collection.createIndex( { z: 1 }, { expireAfterSec: 350 } )
Alterações gerais de compatibilidade
-
Ajuste nos limites de namespace: a partir do MongoDB 3,4, nomes de banco de dados não suportam mais o símbolo
$.NotaAntes de atualizar para o MongoDB 3,4, exclua todos os bancos de dados cujos nomes contenham
$. Remoção do parâmetro
textSearchEnabled. A partir do MongoDB 2.6, a busca de texto é ativada por padrão.Remoção da ferramenta
mongosniff: a partir do MongoDB 3,4, omongosniffé substituído pela ferramentamongoreplay, que oferece recursos mais poderosos e suporta captura e análise de tráfego de rede de forma mais flexível.Alterações no comportamento do estágio de agregação
$project: se o estágio$projectretornar um documento vazio (sem campos preservados ou adicionados), um erro é reportado.-
Problemas de contagem com hints e sparse indexes: ao usar
hint()especificando um sparse index para contar documentos em uma coleção (com um predicado de consulta vazio), o sparse index pode resultar em contagens imprecisas.db.collection.insert({ _id: 1, y: 1 } ); db.collection.createIndex( { x: 1 }, { sparse: true } ); db.collection.find().hint( { x: 1 } ).count();Para obter resultados de contagem corretos, não especifique um sparse index em
hint()ao contar todos os documentos de uma coleção.db.collection.find().count(); db.collection.createIndex({ y: 1 }); db.collection.find().hint({ y: 1 }).count();Antes do MongoDB 3,4, os hints eram ignorados quando o uso de sparse indexes resultava em contagens incompletas.
Alterações nas permissões de funções de usuário
A partir do MongoDB 3,4, as permissões das seguintes funções integradas deixaram de se aplicar aos bancos de dados local e config:
|
Nome da função |
Descrição |
|
readAnyDatabase |
Para conceder permissões de leitura no banco de dados local, crie um usuário no banco de dados admin e atribua explicitamente a função read do banco de dados local a esse usuário. Como alternativa, acesse os bancos de dados config e local com a função clusterManager ou clusterMonitor. |
|
readWriteAnyDatabase |
Para conceder permissões de leitura/gravação no banco de dados local, crie um usuário no banco de dados admin e atribua explicitamente a função readWrite do banco de dados local a esse usuário. |
|
userAdminAnyDatabase |
N/A. |
|
dbAdminAnyDatabase |
Para conceder permissões administrativas no banco de dados local, crie um usuário no banco de dados admin e atribua explicitamente a função dbAdmin do banco de dados local a esse usuário. |
As seguintes funções integradas possuem permissões nos bancos de dados local e config:
clusterManager
clusterMonitor
backup
restore
Recursos incompatíveis com versões anteriores
O MongoDB 3,4 introduz os seguintes recursos que armazenam dados de forma incompatível com versões anteriores. Para ativar esses recursos, defina featureCompatibilityVersion como "3.4".
Views
Collation e índices sem distinção entre maiúsculas e minúsculas
Tipo decimal
-
Versão de índice v2
Suporta collation e tipos de dados decimais.
Quando
featureCompatibilityVersionestá definido como "3.4", a versão padrão de novos índices é v2. Caso contrário, a versão padrão é v1.
Após ativados, esses recursos incompatíveis tornam o processo de downgrade mais complexo.
Para reduzir ao mínimo a possibilidade de downgrade, recomendamos que seu ambiente seja executado sem ativar esses recursos após a atualização. Ative-os somente quando tiver certeza de que a necessidade de downgrade é mínima.
Default featureCompatibilityVersion values:
Novas implantações do MongoDB 3,4: "3.4".
Implantações atualizadas a partir do MongoDB 3.2: "3.2" (deve ser definido manualmente como "3.4").
Antes do MongoDB 3,4, se um banco de dados contiver views, definições de collation ou índices v2, o MongoDB não consegue iniciar. Caso existam campos do tipo decimal, as operações sobre esses documentos podem falhar.
Para atualizar para o MongoDB 3,4, todos os dados incompatíveis devem ser removidos, incluindo views, índices v2 e campos decimais.
Alterações de compatibilidade de drivers
Para usar os novos recursos introduzidos no MongoDB 3,4 (como tipo decimal e collation), atualize seu driver para uma versão que suporte esses recursos.
Alterações de comportamento do $in com elemento único e do upsert
Quando uma operação upsert não encontra documentos correspondentes, ela cria um documento base para upserts com base na declaração de igualdade do predicado de consulta e, em seguida, aplica os operadores de atualização ao documento. Exemplo:
db.c.drop()
db.c.update( { a : 3, b: "foo" }, { $set : { c : 15 } }, { upsert : true } )
db.c.find()
{ "_id" : ObjectId("59c03009529946822d0afb8c"), "a" : 3, "b" : "foo", "c" : 15 }
Antes do MongoDB 3,4, um $in com elemento único não inicializava campos.
db.c.drop()
db.c.update( { a : { $in : [1] } }, { $addToSet : { a : 2 } }, { upsert : true } )
db.c.find()
{ "_id" : ObjectId("58bdb00eb39e8f87607e9222"), "a" : [ 2 ] }
A partir do MongoDB 3,4, um $in com elemento único é tratado como uma declaração de igualdade para upserts:
Se um predicado de consulta incluir um
$incom elemento único, os campos são inicializados como campos escalares em vez de arrays.A operação
$addToSetdo exemplo anterior falha porque operadores de array não podem ser aplicados a campos escalares.
Solução: envolva a expressão $in em $elemMatch para forçar a manutenção do tipo array dos campos.
db.c.drop()
db.c.update(
{ a : { $elemMatch : { $in : [ 2 ] } } },
{ $addToSet : { a: 3 } },
{ upsert: true } )
db.c.find()
{ "_id" : ObjectId("..."), "a" : [ 3 ] }