Docs Menu
Docs Home
/ /

EJSON.stringify()

El EJSON.stringify() El método convierte valores BSON en cadenas.

El método EJSON.stringify() toma un objeto BSON como entrada y modificadores opcionales que controlan el formato de la cadena 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

El objeto EJSON.stringify() se transforma

replacer

matriz o función

Opcional

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

replacer Puede ser una matriz o una función.

Valor
Efecto

arreglo

Una matriz de campos de documento para incluir en la salida. Los elementos de la matriz deben especificar los nombres de campo que se incluirán en la cadena 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 ver un ejemplo, véase Utilice una función para transformar campos de salida.

spacer

entero o cadena de texto

Opcional

Controla el espaciado en la salida. Use null como marcador de posición para replacer si solo desea 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 sangrar cada nivel. Esta opción genera un JSON no válido si se usa un carácter distinto de un espacio o una tabulación. Para 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.

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

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

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

Llame a la interfaz EJSON desde la línea de comandos del 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 iteradores del método de cursor.

Iterador
Características

Bloqueo, amortigua todo el resultado

Sin bloqueo, imprime documentos uno por uno

Sin bloqueo, iterar manualmente los resultados

Para probar estos ejemplos, primero cree 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 sangría entre niveles, configure 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 documento, utilice una matriz para establecer la opción replace.

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

EJSON formatea 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 campo, utilice una función de JavaScript para configurar 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 recursivamente 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 no definidos, por lo que al configurar _id: undefined se elimina el campo _id de la cadena 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 cadenas BSON con la cadena "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 escribir en un archivo desde mongosh, use la API fs. Use EJSON.stringify() para formatear la cadena que pasa 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() formatea el objeto como una cadena 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 sola línea de JSON para cada documento:

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

  • --eval llama al find método

  • .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 scripts. EJSON.stringify() también puede producir un formato legible para 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. Si el replacer no está presente, EJSON.stringify() devuelve todos los campos con un valor definido.

  • 3 es el valor spacer. Indica a EJSON.stringify() que sangre 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 mongosh shell devuelve una salida diferente a la del mongo shell heredado. Si tiene scripts que requieren que la salida tenga un formato similar al del mongo shell heredado, intente reformatear la mongosh salida con EJSON.stringify().

Ejecute una consulta 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 producción:

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

fabricar en serie()