Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Cambios de compatibilidad con mongo shell heredado

Esta página describe las diferencias entre mongosh y el shell heredado mongo. Además de las alternativas enumeradas aquí, puede usar el mongocompat snippet para acceder a las APIs de shell heredadas mongo. Los fragmentos son una funcionalidad experimental, para obtener más información, consulte Snippets.

snippet install mongocompat

Los siguientes métodos de shell están obsoletos en mongosh. En su lugar, utilice los métodos enumerados en Alternative Resources columna.

Método obsoleto
Recursos alternativos

db.collection.copyTo()

Etapa de agregación: $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

Al usar el shell mongo heredado para conectarse directamente a un secundario miembro del set de réplicas, debes ejecutar mongo.setReadPref() para habilitar las lecturas secundarias.

Al usar mongosh para conectarse directamente a un miembro del conjunto de réplicas secundario, puede leer desde ese miembro si especifica una preferencia de lectura de:

Para especificar una preferencia de lectura, puede utilizar:

Cuando se utiliza mongosh para conectarse directamente a un miembro de un set de réplicas secundario, si tu preferencia de lectura está configurada en primaryPreferred, secondary o secondaryPreferred, no se requiere ejecutar rs.secondaryOk().

Los siguientes métodos asistentes de show siempre utilizan una preferencia de lectura de primaryPreferred, incluso cuando se ha especificado una preferencia de lectura diferente para la operación:

  • show dbs

  • show databases

  • show collections

  • show tables

En el shell heredado mongo, estas operaciones utilizan la preferencia de lectura especificada.

Las escrituras reintentables están habilitadas por defecto mongosh en. Estaban deshabilitadas por defecto en el shell antiguo. Para mongo deshabilitarlas,--retryWrites=false utilice.

Estos métodos de ObjectId() funcionan de manera diferente en mongosh que en el shell anterior mongo.

Método o atributo
mongo Comportamiento
mongosh Comportamiento

ObjectId.str

Returns a hexadecimal string:
6419ccfce40afaf9317567b7
Undefined
(Not available)

ObjectId.valueOf()

Returns the value of ObjectId.str:
6419ccfce40afaf9317567b7
Returns a formatted string:
ObjectId("6419ccfce40afaf9317567b7")

ObjectId.toString()

Returns a formatted string:
ObjectId("6419ccfce40afaf9317567b7")
Returns a hexadecimal formatted string:
6419ccfce40afaf9317567b7

La shell heredada mongo almacenaba numéricamente los valores como doubles por defecto. En mongosh, los números se almacenan como enteros de 32 bits, Int32, o como Double en caso de que el valor no se pueda almacenar como un Int32.

MongoDB Shell continúa admitiendo los tipos numéricos que se admiten en la shell de mongo. Sin embargo, los tipos preferidos se han actualizado para alinearse mejor con los drivers de MongoDB. Consulta mongosh tipos de datos para más información.

Los tipos preferidos para variables numéricas son diferentes en MongoDB Shell que los tipos sugeridos en el shell heredado de mongo. Los tipos en mongosh se alinean mejor con los tipos utilizados por los drivers de MongoDB.

mongo tipo
mongosh tipo

NumberInt

Int32

NumberLong

Long

NumberDecimal

Decimal128

Advertencia

Los tipos de datos pueden almacenarse de manera inconsistente si se conecta a la misma colección utilizando tanto mongosh como el shell heredado mongo.

Tip

Para obtener más información sobre la gestión de tipos, consulte la descripción general de la validación del esquema.

El tipo BSON no definido es obsoleto. Si se intenta insertar un documento con el tipo JS indefinido en mongosh, la implementación reemplaza el valor indefinido en el documento por el valor null de BSON. No existe una forma compatible de insertar valores indefinidos en tu base de datos utilizando mongosh.

Por ejemplo, considere ejecutar el siguiente código para insertar un documento en mongosh:

db.people.insertOne( { name : "Sally", age : undefined } )

Al ejecutar este código en mongosh, la shell inserta el siguiente documento:

{ name : "Sally", age : null }

mongosh representa cualquier valor indefinido de BSON almacenado usando otras herramientas, como el controlador Go o la antigua mongo shell, como null.

mongosh no pone entre comillas las claves de objeto en su salida y pone comillas simples en los valores. Para reproducir el resultado de la shell mongo heredado, que envuelve tanto las claves como los valores de string entre comillas double, utiliza mongosh --eval con EJSON.stringify().

Por ejemplo, el siguiente comando devuelve los elementos de la colección sales en la base de datos test con comillas dobles y sangría:

mongosh --eval "EJSON.stringify(db.sales.findOne().toArray(), null, 2)"

La salida se ve de la siguiente manera:

{
"_id": {
"$oid": "64da90c1175f5091debcab26"
},
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 4,
"cost": {
"$numberDecimal": "100.60"
}
}

Los resultados de las consultas a la base de datos no pueden pasarse dentro de los siguientes contextos:

  • Funciones constructoras de clases

  • Funciones generadoras no asíncronas

  • Funciones de retorno a .sort() en un arreglo

  • Establecedores de JavaScript en clases

Para acceder a los resultados de las llamadas a la base de datos, utiliza funciones asíncronas, funciones generadoras asíncronas, o .map().

Los siguientes constructores no funcionan:

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

Utilice una función async en su lugar:

class FindResults {
constructor() {
this.value = ( async() => {
return db.students.find();
} )();
}
}

Nota

También puedes crear un método que realice una operación de base de datos dentro de una clase como alternativa al trabajo con JavaScript asíncrono.

class FindResults {
constructor() { }
init() { this.value = db.students.find(); }
}

Para utilizar esta clase, primero construya una instancia de clase y luego llame al método .init().

Las siguientes funciones generadoras no funcionan:

// This code will fail
function* FindResults() {
yield db.students.findOne();
}
// This code will fail
function listEntries() { return db.students.findOne(); }
function* findResults() {
yield listEntries();
}

Usa un async generator function en su lugar:

function listEntries() { return db.students.findOne(); }
async function* findResults() {
yield listEntries();
}

El siguiente ordenamiento de arreglo no funciona:

// This code will fail
db.getCollectionNames().sort( ( collectionOne, collectionTwo ) => {
return db[ collectionOne ].estimatedDocumentCount() - db[ collectionOne ].estimatedDocumentCount() )
} );

Utiliza .map() en su lugar.

db.getCollectionNames().map( collectionName => {
return { collectionName, size: db[ collectionName ].estimatedDocumentCount() };
} ).sort( ( collectionOne, collectionTwo ) => {
return collectionOne.size - collectionTwo.size;
} ).map( collection => collection.collectionName);

Este enfoque para ordenar matrices suele tener mejor rendimiento que el código equivalente no compatible.

El siguiente setter de JavaScript no 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 });
}
}

Para los comandos cuya salida incluye { ok: 0 }, mongosh devuelve una excepción coherente y omite la salida sin procesar del servidor. El shell mongo heredado devuelve una salida que varía para cada comando.

Para obtener más detalles, consulte Ejecutar comandos.

La shell heredada mongo usa un archivo de configuración llamado .mongorc.js.

Si mongosh encuentra .mongorc.js al iniciar, pero no encuentra .mongoshrc.js, mongosh no carga el archivo heredado .mongorc.js e indica que debes renombrar .mongorc.js a .mongoshrc.js.

Para obtener más detalles, consulta .mongoshrc Archivo de configuración.

MongoDB almacena datos usando BSON, que admite tipos de datos adicionales que no están disponibles en JSON. El shell mongosh ofrece un mejor soporte para tipos de datos para los drivers que el shell mongo heredado.

Para obtener detalles, consulte Tipos de datos.

El shell mongo heredado no puede acceder al nombre de archivo ni al directorio de un script en el método load().

Para más detalles, consulte load().

Por defecto, las escrituras reintentables son:

  • activado en mongosh

  • desactivado en el shell mongo heredado

Para desactivar las escrituras reintentables, utilice --retryWrites=false.

Para obtener más detalles, consulte --retryWrites.

El shell mongosh devuelve una salida que difiere del shell mongo heredado. Si tienes scripts que requieren que la salida esté formateada de manera similar al shell heredado mongo, intenta reformatear la salida mongosh con EJSON.stringify().

Para obtener más detalles, consulta tojsononeline() heredado.

El trabajo con fragmentos de código es diferente para el shell mongo heredado.

Para obtener más detalles, ver Obtener ayuda para un snippet.

Volver

Guía rápida

En esta página