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
/ /

EJSON.stringify()

La EJSON.stringify() el método convierte los valores BSON en cadenas de texto.

El método EJSON.stringify() toma un objeto BSON como entrada y modificadores opcionales que controlan el formato de la string de salida.

EJSON.stringify(BSON object, [replacer], [space], [options])

El método EJSON.stringify() tiene estos campos:

Campo
Tipo
Necesidad
Descripción

value

Objeto BSON

Requerido

Objeto EJSON.stringify() se transforma

replacer

arreglo o función

Opcional

Modifica la salida. Si el valor existe pero no es un arreglo ni una función, EJSON.stringify() devuelve todos los campos del documento.

replacer Puede ser una matriz o una función.

Valor
Efecto

arreglo

Un arreglo de campos de documentos para incluir en la salida. Los elementos del arreglo deben especificar los nombres de los campos que se incluirán en la string JSON devuelta.

función

Una función que toma dos parámetros, key y value. key proporciona el contexto this de la función. EJSON devuelve el value transformado.

La función se ejecuta para cada objeto. Los valores del objeto se reemplazan con el valor de retorno de la función.

Para obtener un ejemplo, consulta Utiliza una función para transformar los campos de salida.

spacer

entero o cadena de texto

Opcional

Controla el espaciado en la salida. Usa null como marcador de posición para replacer si solo deseas especificar la opción spacer.

Valor
Efecto

entero

El número de espacios para sangrar cada nivel. 10 es el máximo.

string

Un carácter para usar para indentar cada nivel. Esta opción produce JSON no válido si usas un carácter distinto de un espacio o una pestaña. Para obtener más información, consulte JSON.stringify()

options

booleano

Opcional

Opciones de configuración adicionales

Opción
predeterminado
Significado

relaxed

true

Habilite el modo relajado para JSON extendido. Devuelve tipos JSON nativos en lugar de adjuntar información de tipo BSON cuando corresponda.

Puedes llamar a la interfaz EJSON desde dentro de una sesión interactiva de mongosh o desde la línea de comandos del sistema usando --eval.

Llama a la interfaz EJSON desde una sesión interactiva:

EJSON.stringify( db.sales.find().toArray(), null, 2 )

Llama a la interfaz EJSON desde la línea de comandos de tu sistema:

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

Para controlar cómo se pasan los documentos a EJSON, utilice uno de los mongosh métodos de cursor iteradores.

Iterador
Características

Blocking, almacena en búfer todo el resultado

Sin bloqueo, imprime documentos uno por uno

Iteración manual, no bloqueante, sobre los resultados

Para probar estos ejemplos, primero crea una colección sales en la base de datos test:

db.sales.insertMany( [
{ custId: 345, purchaseDate: ISODate("2023-07-04"), quantity: 4, cost: Decimal128("100.60"), },
{ custId: 346, purchaseDate: ISODate("2023-07-12"), quantity: 3, cost: Decimal128("175.45"), },
{ custId: 486, purchaseDate: ISODate("2023-08-01"), quantity: 9, cost: Decimal128("200.53"), },
] )

Para aumentar la indentación entre niveles, configura la opción spacing.

EJSON.stringify( db.sales.findOne( { custId: 345 } ), null , 5 )

EJSON.stringify() sangra cada documento con cinco espacios de nivel.

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

Para seleccionar un subconjunto de campos de documentos, usa un arreglo para configurar la opción replace.

EJSON.stringify( db.sales.find().toArray(), [ "quantity", "cost" ] )

EJSON da formato al quantity y cost para cada documento.

[{"quantity":4,"cost":{}},{"quantity":3,"cost":{}},{"quantity":9,"cost":{}}]

La opción spacing no se especifica en este ejemplo, por lo que EJSON devuelve los campos seleccionados en una sola línea.

Para transformar los valores de los campos, usa una función de JavaScript para establecer la opción replacer. Por ejemplo:

let queryResults = db.sales.find().toArray()
let replacer = function( key, value ){
if ( key === '_id' ) {
value = undefined;
}
if ( key === 'quantity' ) {
value = 2 * value;
}
return value;
}
EJSON.stringify( queryResults, replacer, 3 )

La función se ejecuta de forma recursiva contra el objeto de entrada.

Ejemplo de salida:

[
{
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 8,
"cost": {
"$numberDecimal": "100.60"
}
},
{
"custId": 346,
"purchaseDate": {
"$date": "2023-07-12T00:00:00Z"
},
"quantity": 6,
"cost": {
"$numberDecimal": "175.45"
}
},
{
"custId": 486,
"purchaseDate": {
"$date": "2023-08-01T00:00:00Z"
},
"quantity": 18,
"cost": {
"$numberDecimal": "200.53"
}
}
]

La función replacer actualiza dos campos, _id y quantity.

EJSON.stringify() ignora los campos con valores indefinidos, por lo que establecer _id: undefined remueve el campo _id de la string de salida.

La función también modifica el campo quantity en la cadena de salida. Todos los valores quantity se multiplican por dos en la cadena de salida. EJSON.stringify() no actualiza la colección.

Crea la colección salesWithAddress con direcciones anidadas:

db.salesWithAddress.insertMany( [
{ custId: 345, purchaseDate: ISODate("2023-07-04"),
quantity: 4, cost: Decimal128("100.60"),
address: { number: 100, street: "Main Street", ZIP: 12345 } },
{ custId: 346, purchaseDate: ISODate("2023-07-12"),
quantity: 3, cost: Decimal128("175.45"),
address: { number: 200, street: "East Street", ZIP: 12345 } }
] )

El siguiente ejemplo utiliza una función replacer para cambiar los códigos postales de las direcciones a 55555:

// Retrieve the salesWithAddress contents as an array and save
// in queryResults
let queryResults = db.salesWithAddress.find().toArray()
// Define a replacer function to change the ZIP codes
let replacer = function( key, value ) {
if (key === 'address') {
value.ZIP = 55555;
}
return value;
}
// Run EJSON.stringify() to change the ZIP codes in queryResults
EJSON.stringify( queryResults, replacer, 3 )

Ejemplo de salida:

[
{
"_id": {
"$oid": "65498c6562f443aa1490070f"
},
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 4,
"cost": {
"$numberDecimal": "100.60"
},
"address": {
"number": 100,
"street": "Main Street",
"ZIP": 55555
}
},
{
"_id": {
"$oid": "65498c6562f443aa14900710"
},
"custId": 346,
"purchaseDate": {
"$date": "2023-07-12T00:00:00Z"
},
"quantity": 3,
"cost": {
"$numberDecimal": "175.45"
},
"address": {
"number": 200,
"street": "East Street",
"ZIP": 55555
}
}
]

Para obtener una lista de tipos de datos BSON y los códigos numéricos correspondientes, consulte BSON Types.

El siguiente ejemplo utiliza una función replacer para reemplazar las strings BSON por la string "This is a string":

// Retrieve the salesWithAddress contents as an array and save
// in queryResults
let queryResults = db.salesWithAddress.find().toArray()
// Define a replacer function to replace the strings
let replacer = function( key, value ) {
if (typeof value === "string") {
return "This is a string";
}
return value;
}
// Run EJSON.stringify() to replace the strings in queryResults
EJSON.stringify( queryResults, replacer, 3 )

Ejemplo de salida:

[
{
"_id": {
"$oid": "This is a string"
},
"custId": 345,
"purchaseDate": {
"$date": "This is a string"
},
"quantity": 4,
"cost": {
"$numberDecimal": "This is a string"
},
"address": {
"number": 100,
"street": "This is a string",
"ZIP": 12345
}
},
{
"_id": {
"$oid": "This is a string"
},
"custId": 346,
"purchaseDate": {
"$date": "This is a string"
},
"quantity": 3,
"cost": {
"$numberDecimal": "This is a string"
},
"address": {
"number": 200,
"street": "This is a string",
"ZIP": 12345
}
}
]

Para guardar en un archivo desde mongosh, utiliza la API fs. Utiliza EJSON.stringify() para formatear la string que pasas a fs.

const sales_2023_07 = db.sales.find(
{
purchaseDate:
{
$gte: ISODate( "2023-07-01" ),
$lte: ISODate( "2023-07-31" )
}
}
)
fs.writeFileSync(
'sales_2023_07.json',
EJSON.stringify( sales_2023_07.toArray(), null, 2 )
)

El ejemplo consulta la colección sales para las ventas de julio, 2023.

  • sales_2023_07 almacena un objeto BSON de MongoDB.

  • EJSON.stringify() da formato al objeto como una string JSON.

  • fs.writeFileSync() escribe la cadena formateada en el archivo sales_2023_07.json en el directorio donde ejecutó mongosh.

Para ejecutar una consulta desde el shell del sistema operativo, utilice la --eval opción.

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "db.sales.find().forEach( \
o => print( EJSON.stringify( o ) ) )"

El comando devuelve una única línea de JSON para cada documento:

  • --quiet suprime la información de conexión mongosh

  • --eval llama al método find

  • .forEach es un método de JavaScript que le dice a mongosh que itere sobre la respuesta

  • EJSON.stringify() convierte cada documento a JSON

La salida es:

{"_id":{"$oid":"64da90c1175f5091debcab26"},"custId":345,"purchaseDate":{"$date":"2023-07-04T00:00:00Z"},"quantity":4,"cost":{"$numberDecimal":"100.60"}}
{"_id":{"$oid":"64da90c1175f5091debcab27"},"custId":346,"purchaseDate":{"$date":"2023-07-12T00:00:00Z"},"quantity":3,"cost":{"$numberDecimal":"175.45"}}
{"_id":{"$oid":"64da90c1175f5091debcab28"},"custId":486,"purchaseDate":{"$date":"2023-08-01T00:00:00Z"},"quantity":9,"cost":{"$numberDecimal":"200.53"}}

El formato de salida de una sola línea es conveniente para la creación de scripts. EJSON.stringify() también puede producir un formato legible por humanos:

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "db.sales.find().forEach( \
o => print( EJSON.stringify(o, null, 3 ) ) )"

La salida es:

# Note: This is only the first document.
{
"_id": {
"$oid": "64da90c1175f5091debcab26"
},
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 4,
"cost": {
"$numberDecimal": "100.60"
}
}
  • o es el valor BSON que EJSON.stringify() convierte en cada iteración de .forEach().

  • null es un marcador de posición para un replacer opcional. Cuando el replacer está ausente, EJSON.stringify() regresa todos los campos que tienen un valor definido.

  • 3 es el valor de spacer. Indica a EJSON.stringify() que indente cada nuevo nivel con 3 espacios.

Si desea que la cadena de salida tenga información de tipo adicional, agregue la opción { relaxed: false }:

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "db.sales.find().forEach( \
o => print( \
EJSON.stringify( o, null, 3, { relaxed: false } ) \
) )"

La salida es:

# Note: This is only the first document.
{
"_id": {
"$oid": "64da90c1175f5091debcab26"
},
"custId": {
"$numberInt": "345"
},
"purchaseDate": {
"$date": {
"$numberLong": "1688428800000"
}
},
"quantity": {
"$numberInt": "4"
},
"cost": {
"$numberDecimal": "100.60"
}
}

EJSON.stringify() proporciona opciones de formato que reducen la necesidad de un analizador JSON adicional, como jq.

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "EJSON.stringify( \
db.sales.find( {}, \
{ _id: 0, custId: 1, quantity: 1 } ).toArray(), null, 2 \
);"

La salida es:

[
{
"custId": 345,
"quantity": 4
},
{
"custId": 346,
"quantity": 3
},
{
"custId": 486,
"quantity": 9
}
]

El shell mongosh devuelve una salida que difiere del shell heredado mongo. Si tienes scripts que requieren que el resultado se formatee de manera similar al antiguo shell mongo, intenta volver a formatear el resultado de mongosh con EJSON.stringify().

Ejecutar una query de muestra en mongosh y mongo para ver los diferentes formatos.

db.sales.find( { custId: 345 } )

Salida heredada:

{ "_id" : ObjectId("64da90c1175f5091debcab26"), "custId" : 345, "purchaseDate" : ISODate("2023-07-04T00:00:00Z"), "quantity" : 4, "cost" : NumberDecimal("100.60") }

mongosh Salida:

db.sales.find( { custId: 345 } )
[
{
_id: ObjectId("64da90c1175f5091debcab26"),
custId: 345,
purchaseDate: ISODate("2023-07-04T00:00:00.000Z"),
quantity: 4,
cost: Decimal128("100.60")
}
]

Reformatee la salida con EJSON.stringify().

EJSON.stringify( db.sales.find( { custId: 345 } ).toArray() )
[{"_id":{"$oid":"64da90c1175f5091debcab26"},"custId":345,"purchaseDate":{"$date":"2023-07-04T00:00:00Z"},"quantity":4,"cost":{"$numberDecimal":"100.60"}}]

Volver

serialize()