El EJSON.stringify() El método convierte valores BSON en cadenas.
Sintaxis
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])
Campos de comandos
El método EJSON.stringify() tiene estos campos:
Campo | Tipo | Necesidad | Descripción | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Objeto BSON | Requerido | El objeto | ||||||
| matriz o función | Opcional | Modifica la salida. Si el valor existe, pero no es una matriz ni una función,
| ||||||
| entero o cadena de texto | Opcional | Controla el espaciado en la salida. Use
| ||||||
| booleano | Opcional | Opciones de configuración adicionales
|
Comportamiento
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 |
Ejemplos
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"), }, ] )
Cambiar el espaciado de salida
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" } }
Seleccionar campos de salida
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.
Utilice una función para transformar los campos de salida
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.
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 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 } } ]
Escribir en un archivo desde dentro de mongosh
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_07almacena un objeto BSON de MongoDB.EJSON.stringify()formatea el objeto como una cadena 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 sola línea de JSON para cada documento:
--quietsuprime la información de conexiónmongosh--evalllama alfindmétodo.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 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" } }
oes el valor BSON queEJSON.stringify()convierte en cada iteración de.forEach().nullEs un marcador de posición para unreplaceropcional. Si elreplacerno está presente,EJSON.stringify()devuelve todos los campos con un valor definido.3es el valorspacer. Indica aEJSON.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" } }
Campos de salida de filtro
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 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"}}]
Obtén más información
Documentación deEJSON
Documentación de JSON.stringify() de Mozilla Developer Network