La EJSON.stringify() el método convierte los valores BSON en cadenas de texto.
Sintaxis
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])
Campos de comandos
El método EJSON.stringify() tiene estos campos:
Campo | Tipo | Necesidad | Descripción | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Objeto BSON | Requerido | Objeto | ||||||
| arreglo o función | Opcional | Modifica la salida. Si el valor existe pero no es un arreglo ni una función,
| ||||||
| entero o cadena de texto | Opcional | Controla el espaciado en la salida. Usa
| ||||||
| booleano | Opcional | Opciones de configuración adicionales
|
Comportamiento
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 |
Ejemplos
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"), }, ] )
Cambiar el espaciado de salida
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" } }
Seleccionar campos de salida
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.
Utilice una función para transformar campos de salida
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.
Usar una función para transformar los campos de salida en objetos anidados
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 } } ]
Utilice una función para reemplazar cadenas BSON
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 } } ]
Guardar en un Archivo desde Dentro de mongosh
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_07almacena un objeto BSON de MongoDB.EJSON.stringify()da formato al objeto como una string JSON.fs.writeFileSync()escribe la cadena formateada en el archivosales_2023_07.jsonen el directorio donde ejecutómongosh.
Ejecutar desde la línea de comandos
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:
--quietsuprime la información de conexiónmongosh--evalllama al métodofind.forEaches un método de JavaScript que le dice amongoshque itere sobre la respuestaEJSON.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" } }
oes el valor BSON queEJSON.stringify()convierte en cada iteración de.forEach().nulles un marcador de posición para unreplaceropcional. Cuando elreplacerestá ausente,EJSON.stringify()regresa todos los campos que tienen un valor definido.3es el valor despacer. Indica aEJSON.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" } }
Filtrar campos de salida
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 } ]
Legacy tojsononeline()
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"}}]
Obtén más información
EJSON documentation
Mozilla Red de Desarrolladores JSON.stringify() documentación