Resolver problemas comuns na API do Azure Cosmos DB para MongoDB

APLICA-SE A: MongoDB

O artigo seguinte descreve erros comuns e soluções para implementações com o Azure Cosmos DB para MongoDB.

Nota

O Azure Cosmos DB não aloja o motor do MongoDB. Fornece uma implementação do protocolo de transmissão do MongoDB versão 4.0, 3.6 e suporte legado para a versão 3.2 do protocolo wire. Por conseguinte, alguns destes erros só são encontrados na API do Azure Cosmos DB para MongoDB.

Erros comuns e soluções

Código Erro Descrição Solução
2 BadValue Uma causa comum é que um caminho de índice correspondente ao item order-by especificado é excluído ou a ordem por consulta não tem um índice composto correspondente a partir do qual possa ser servido. A consulta pede uma ordenação num campo que não está indexado. Crie um índice correspondente (ou índice composto) para a consulta de ordenação que está a ser tentada.
2 A transação não está ativa A transação de vários documentos ultrapassou o limite de tempo fixo de 5 segundos. Repita a transação multidocumentos ou limite o âmbito das operações na transação multidocumentos para a completar no limite de tempo de 5 segundos.
13 Não autorizado O pedido não tem as permissões para ser concluído. Certifique-se de que está a utilizar as chaves corretas.
26 NamespaceNotFound Não é possível localizar a base de dados ou coleção que está a ser referenciada na consulta. Verifique se o nome da base de dados/coleção corresponde exatamente ao nome na consulta.
50 ExceededTimeLimit O pedido excedeu o tempo limite de 60 segundos de execução. Pode haver muitas causas para este erro. Uma das causas é quando a capacidade das unidades de pedido atualmente alocadas não é suficiente para concluir o pedido. Isto pode ser resolvido ao aumentar as unidades de pedido dessa coleção ou base de dados. Noutros casos, este erro pode ser solucionado através da divisão de um pedido grande em partes menores. Repetir uma operação de escrita que recebeu este erro pode resultar numa escrita duplicada.

Se estiver a tentar eliminar grandes quantidades de dados sem que isto tenha impacto sobre as RUs:
- Considere a utilização de TTL (com base no Carimbo de Data/Hora): Dados de expiração com a API do Azure Cosmos DB para MongoDB
- Utilize o tamanho do Cursor/Lote para executar a eliminação. Pode obter um único documento de cada vez e eliminá-lo através de um ciclo. Esta operação ajudará a eliminar dados lentamente sem afetar a aplicação de produção.
61 ShardKeyNotFound O documento no pedido não continha a chave de partição horizontal da coleção (chave de partição do Azure Cosmos DB). Verifique se a chave shard da coleção está a ser utilizada no pedido.
66 ImmutableField O pedido está a tentar alterar um campo imutável Os campos "_id" são imutáveis. Certifique-se de que o pedido não tenta atualizar esse campo ou o campo da chave de partição horizontal.
67 CannotCreateIndex Não é possível concluir o pedido para criar um índice. Podem ser criados até 500 índices de campo único num contentor. Podem ser incluídos até oito campos num índice composto (os índices compostos são suportados na versão 3.6e superior).
112 WriteConflict A transação multidocumentos falhou devido a uma transação multidocumentos em conflito Repita a transação multidocumentos até ser concluída com êxito.
115 CommandNotSupported O pedido tentado não é suportado. Devem ser fornecidos outros detalhes no erro. Se esta funcionalidade for importante para as suas implementações, crie um pedido de suporte no portal do Azure e a equipa do Azure Cosmos DB irá aceder-lhe novamente.
11000 DuplicateKey A chave shard (chave de partição do Azure Cosmos DB) do documento que está a inserir já existe na coleção ou foi violada uma restrição de campo do índice exclusivo. Utilize a função update() para atualizar um documento existente. Se a restrição de campo de índice exclusivo tiver sido violada, insira ou atualize o documento com um valor de campo que ainda não existe na partição/partição horizontal. Outra opção seria utilizar um campo que contenha uma combinação dos campos de chave de partição horizontal e ID.
16500 TooManyRequests O número total de unidades de pedido consumidas é maior do que a taxa pedido/unidade aprovisionada para a coleção e foi limitada. Pondere dimensionar o débito atribuído a um contentor ou a um conjunto de contentores do portal do Azure ou pode repetir a operação. Se ativar o SSR (repetição do lado do servidor), o Azure Cosmos DB repetirá automaticamente os pedidos que falham devido a este erro.
16501 LimiteMemóriaExcedido Como um serviço multi-inquilino, a operação ultrapassou a alocação de memória do cliente. Isto só é aplicável ao Azure Cosmos DB para MongoDB versão 3.2. Reduza o âmbito da operação através de critérios de consulta mais restritivos ou contacte o suporte a partir do portal do Azure. Exemplo: db.getCollection('users').aggregate([{$match: {name: "Andy"}}, {$sort: {age: -1}}]))
40324 Nome da fase do pipeline não reconhecido. O nome da fase no pedido do pipeline de agregação não foi reconhecido. Verifique se todos os nomes de pipelines de agregação são válidos no pedido.
- Problemas da versão de transmissão do MongoDB As versões mais antigas dos controladores do MongoDB não conseguem detetar o nome da conta do Azure Cosmos DB nas cadeias de ligação. Acrescente appName=@accountName@ no final da cadeia de ligação, em que accountName é o nome da conta do Azure Cosmos DB.
- Problemas de rede do cliente do MongoDB (como exceções de socket ou endOfStream) Falha no pedido da rede. Geralmente causado por uma ligação TCP inativa que o cliente do MongoDB está a tentar utilizar. Os controladores do MongoDB utilizam frequentemente conjuntos de ligações, o que resulta numa ligação aleatória escolhida a partir do conjunto que está a ser utilizado para um pedido. Normalmente, as ligações inativas expiram no Azure Cosmos DB após quatro minutos. Pode repetir estes pedidos falhados no código da aplicação, alterar as definições do cliente do MongoDB (controlador) para repor as ligações TCP inativas antes da janela de tempo limite de quatro minutos ou configurar as definições keepalive do SO para manter as ligações TCP num estado ativo.

Para evitar mensagens relacionadas com a conectividade, altere a cadeia de ligação de modo a definir maxConnectionIdleTime para 1 a 2 minutos.
- Controlador do Mongo: configure maxIdleTimeMS=120000
- Node.JS: configure socketTimeoutMS=120000, autoReconnect = true, keepAlive = true, keepAliveInitialDelay = 3 minutos
- A Shell do Mongo não está a funcionar no portal do Azure Quando o utilizador está a tentar abrir uma shell do Mongo, nada acontece e o separador fica em branco. Verifique a Firewall. A firewall não é suportada com a shell do Mongo no portal do Azure.
- Instale a shell do Mongo no computador local dentro das regras da firewall
- Utilize a shell do Mongo legada
- Não é possível ligar à cadeia de ligação A cadeia de ligação foi alterada ao atualizar de 3.2 para> 3.6 Ao utilizar a API do Azure Cosmos DB para contas mongoDB, a versão 3.6 das contas tem o ponto final no formato *.mongo.cosmos.azure.com , enquanto a versão 3.2 das contas tem o ponto final no formato *.documents.azure.com.

Passos seguintes