Menu Docs
Página inicial do Docs
/
MongoDB Shell
/

Alterações de compatibilidade com o legado mongo Shell

Nesta página

  • Métodos obsoletos
  • Ler comportamento de preferência
  • Comportamento de preferência de escrita
  • Métodos e atributos do ObjectId
  • Valores numéricos
  • Comportamento de cotação de objetos
  • Limitações nas chamadas de banco de dados

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

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.

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:

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().

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.

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.

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

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.

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"
}
}

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 matriz

  • Setters 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().

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().

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();
}

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.

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 });
}
}
← Referência