Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Cambios de compatibilidad con mongo shell heredado

Esta página describe las diferencias entre mongosh y la shell mongo heredada. Además de las alternativas enumeradas aquí, puede utilizar 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 la 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.

Cuando utilices mongosh para conectarte directamente a un secundario miembro de un set de réplicas, puedes leer de ese miembro si especificas una preferencia de lectura de:

Para especificar una preferencia de lectura, puedes usar cualquiera de los siguientes métodos:

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 la shell heredada de mongo, estas operaciones utilizan la preferencia de lectura especificada.

Grabaciones reintentables están habilitadas por defecto en mongosh. Los mensajes de escritura reintentables estaban desactivados por defecto en el shell heredado mongo. Para desactivar las escrituras reintentables, utiliza --retryWrites=false.

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 forma incoherente si te conectás a la misma colección utilizando tanto mongosh como el shell legado mongo.

Tip

Para obtener más información sobre la gestión de tipos, consulta la visión general de validación de esquemas.

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 ítems de la colección sales en la base de datos test con comillas double 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

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

Utiliza en su lugar una función async:

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 usar esta clase, primero construya una instancia de la 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 arreglos suele ser más eficiente 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, consulta 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