Alterações de compatibilidade com o legado mongo
Shell
Nesta página
This page describes differences between mongosh
and the legacy mongo
shell. In addition to the alternatives listed here, you can use the mongocompat snippet to access to legacy mongo
shell APIs. Snippets are an experimental feature, for more information, see Snippets.
snippet install mongocompat
Métodos obsoletos
Os seguintes métodos de shell são preteridos no mongosh
. Em vez disso, utilize os métodos listados na coluna Alternative Resources.
Método preterido | Recursos alternativos |
---|---|
db.collection.copyTo() | Estágio de agregação: $out |
db.collection.count() | |
db.collection.insert() | |
db.collection.remove() | |
db.collection.save() | |
db.collection.update() | |
DBQuery.shellBatchSize | |
Mongo.getSecondaryOk | |
Mongo.isCausalConsistency | |
Mongo.setSecondaryOk | |
rs.secondaryOk | Não é mais necessário. Consulte Ler operações em um nó secundário. |
Ler comportamento de preferência
Ler operações em um nó secundário
Ao usar o mongo shell legado para se conectar diretamente ao nó secundário do conjunto de réplicas, você deve executar mongo.setReadPref()
para habilitar leituras secundárias.
Ao usar mongosh
para se conectar diretamente a um nó secundário do conjunto de réplicas, você pode ler a partir desse nó se especificar uma read preference de:
Para especificar uma preferência de leitura, você pode usar:
A opção de string de conexão
readPreference
ao se conectar ao nó.O método
Mongo.setReadPref()
.
Ao usar mongosh
para se conectar diretamente a um membro do conjunto de réplicas do conjunto de réplicas, se a preferência de leitura estiver definida como primaryPreferred
, secondary
ou , secondaryPreferred
não será necessário rs.secondaryOk()
.
show
Métodos de ajuda
Os seguintes métodos auxiliares de show
sempre usam uma preferência de leitura de primaryPreferred
, mesmo quando uma preferência de leitura diferente tiver sido especificada para a operação:
show dbs
show databases
show collections
show tables
No shell legado mongo
, estas operações utilizam a preferência de leitura especificada.
Comportamento de preferência de escrita
Gravações repetíveis são habilitadas por padrão no mongosh
. As gravações repetíveis foram desabilitadas por padrão no shell legado mongo
. Para desativar gravações repetíveis, use --retryWrites=false
.
Métodos e atributos do ObjectId
Estes métodos ObjectId() funcionam de forma diferente no mongosh
e no mongo
shell legado.
Método ou Atributo | mongo Comportamento | mongosh Comportamento |
---|---|---|
ObjectId.str | Retorna uma string hexadecimal: 6419ccfce40afaf9317567b7 | Indefinido (Não disponível) |
ObjectId.valueOf() | Retorna o valor de ObjectId.str :6419ccfce40afaf9317567b7 | Retorna uma string formatada: ObjectId("6419ccfce40afaf9317567b7") |
ObjectId.toString() | Retorna uma string formatada: ObjectId("6419ccfce40afaf9317567b7") | Retorna uma string formatada hexadecimal: 6419ccfce40afaf9317567b7 |
Valores numéricos
O mongo
shell legado armazenou valores numéricos como doubles
por padrão. Em mongosh
, os números são armazenados como inteiros de 32 bits, Int32
ou então como Double
se o valor não puder ser armazenado como Int32
.
MongoDB Shell continua suportando os tipos numéricos que são suportados no shell mongo
. No entanto, os tipos preferidos foram atualizados para melhor alinhamento com os drivers MongoDB. Consulte Tipos de dados mongosh para obter mais informações.
Os tipos preferidos para variáveis numéricas são diferentes no MongoDB Shell do que os tipos sugeridos no shell legado mongo
. Os tipos em mongosh
se alinham melhor com os tipos usados pelos drivers do MongoDB.
mongo type | mongosh type |
---|---|
NumberInt | Int32 |
NumberLong | Long |
NumberDecimal | Decimal128 |
Aviso
Os tipos de dados podem ser armazenados de forma inconsistente se você se conectar à mesma coleção usando o mongosh
e o shell legado mongo
.
Dica
Veja também:
Para obter mais informações sobre os tipos de gerenciamento, veja a visão geral de validação de esquema.
Comportamento de cotação de objetos
mongosh
não coloca aspas nas chaves do objeto em sua saída e coloca aspas simples nos valores. Para reproduzir a saída do shell legado mongo
, que envolve as chaves e os valores de string entre aspas duplas, use mongosh --eval
com EJSON.stringify().
Por exemplo, o seguinte comando gera os itens na collection sales
no banco de dados do test
com aspas duplas e recuo:
mongosh --eval "EJSON.stringify(db.sales.findOne().toArray(), null, 2)"
A saída parece o seguinte:
{ "_id": { "$oid": "64da90c1175f5091debcab26" }, "custId": 345, "purchaseDate": { "$date": "2023-07-04T00:00:00Z" }, "quantity": 4, "cost": { "$numberDecimal": "100.60" } }
Limitações nas chamadas de banco de dados
Os resultados das queries do banco de dados não podem ser passados dentro dos seguintes contextos:
Funções do construtor de classes
Funções de gerador não assíncronas
Retornos de chamada para
.sort()
em uma matrizSetters de JavaScript em classes
Para acessar os resultados de chamadas de banco de dados, use funções assíncronas, funções assíncronas de gerador ou .map()
.
Construtores
Os seguintes construtores não funcionam:
// This code will fail class FindResults { constructor() { this.value = db.students.find(); } } // This code will fail function listEntries() { return db.students.find(); } class FindResults { constructor() { this.value = listEntries(); } }
Em vez disso, use uma função async
:
class FindResults { constructor() { this.value = ( async() => { return db.students.find(); } )(); } }
Observação
Você também pode criar um método que executa uma operação do banco de dados dentro de uma classe como uma alternativa para trabalhar com JavaScript assíncrono.
class FindResults { constructor() { } init() { this.value = db.students.find(); } }
Para usar essa classe, primeiro construa uma instância de classe e depois chame o método .init()
.
Funções do gerador
As seguintes funções do gerador não funcionam:
// This code will fail function* FindResults() { yield db.students.findOne(); } // This code will fail function listEntries() { return db.students.findOne(); } function* findResults() { yield listEntries(); }
Use um async generator function
em vez disso:
function listEntries() { return db.students.findOne(); } async function* findResults() { yield listEntries(); }
Classificação de array
A seguinte classificação de array não funciona:
// This code will fail db.getCollectionNames().sort( ( collectionOne, collectionTwo ) => { return db[ collectionOne ].estimatedDocumentCount() - db[ collectionOne ].estimatedDocumentCount() ) } );
Em vez disso, use .map()
.
db.getCollectionNames().map( collectionName => { return { collectionName, size: db[ collectionName ].estimatedDocumentCount() }; } ).sort( ( collectionOne, collectionTwo ) => { return collectionOne.size - collectionTwo.size; } ).map( collection => collection.collectionName);
Essa abordagem para a classificação de array geralmente é mais eficiente do que o código equivalente sem suporte.
Configuradores de JavaScript
O seguinte configurador JavaScript não funciona:
// This code will fail class TestClass { value = 1; get property() { return this.value; } // does not work: set property(value) { this.value = db.test.findOne({ value }); } }