Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

677
Views
Extraer decimales de NumberDecimal con Mongo(ose)

En el modelo numérico para almacenar valores monetarios, los documentos de MongoDB establecen:

Desde el shell mongo, los valores decimales se asignan y se consultan mediante el constructor NumberDecimal().

De manera similar, cuando se usa la biblioteca Morphia Java, los BigDecimals se insertan automáticamente como BigDecimals.

Estoy consultando Mongo en Node con Mongoose e intentando extraer el valor numérico de un campo almacenado como NumberDecimal. Sin embargo, el valor está extrañamente envuelto en los resultados de la consulta y no estoy seguro de cómo extraerlo a través de Mongo o Mongoose:

 [ { "openValue":{ "$numberDecimal":"119.931" }, "timestamp":"2017-01-20T10:30:00.000Z" }, { "openValue":{ "$numberDecimal":"119.965" }, "timestamp":"2017-01-20T10:31:00.000Z" } ]

Una publicación que leí decía que usar parseFloat() en el código de mi aplicación realizará lo que deseo, sin embargo, no es eficiente iterar a través del resultado para realizar esta transformación. Evitar iterar y transformar significaría ejecutar la función en NumberDecimals siempre que quiera su valor cada vez, lo que sería molesto.

¿Hay alguna manera de que pueda usar Mongo o Mongoose para convertir el resultado de la consulta JSON anterior en lo que está a continuación?

 [ { "openValue": 119.931, "timestamp":"2017-01-20T10:30:00.000Z" }, { "openValue": 119.965, "timestamp":"2017-01-20T10:31:00.000Z" }, { "openValue": 119.975, "timestamp":"2017-01-20T10:32:00.000Z" } ]

Intenté seleccionar el campo como ...openValue.$numberDecimal , pero no funcionó. ¡Gracias!

Editar: Aquí está mi esquema Mongoose:

 var EquityHistoryModel = new Schema({ _id: { equityIdentifier: { type: { exchange: { type: String, index: true }, symbol: { type: String, index: true } }, index: true }, instant: { type: Date, index: true }, durationMinutes: { type: Number } }, open: { type: mongoose.Schema.Types.Decimal }, high: { type: mongoose.Schema.Types.Decimal }, low: { type: mongoose.Schema.Types.Decimal }, close: { type: mongoose.Schema.Types.Decimal }, volume: { type: Number }, isDividendAdjusted: { type: Boolean }, isSplitAdjusted: { type: Boolean } }, { collection: 'equityHistories', versionKey: false });

Aquí está la consulta Mongoose para el primer resultado JSON anterior:

 mongo.EquityHistoryModel.aggregate([ { "$match":{ "_id.equityIdentifier.exchange":passed_in, "_id.equityIdentifier.symbol":passed_in, "_id.instant":passed_in } }, { "$project":{ "_id":0, "openValue":"$open", "timestamp":"$_id.instant" } } ],
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

También puede sobrescribir el método toJSON :

 // Never return '__v' field and return the 'price' as String in the JSON representation // Note that this doesn't effect `toObject` EquityHistoryModel.set('toJSON', { getters: true, transform: (doc, ret) => { if (ret.price) { ret.price = ret.price.toString(); } delete ret.__v; return ret; }, });
over 4 years ago · Santiago Trujillo Report

0

Al contrario de lo que esperaba, parece que los valores se extraen automáticamente. La cadena del resultado envuelve automáticamente el valor en NumberDecimal. Vea el código con la salida colocada manualmente a continuación:

 console.log(docs[0].openValue); 119.800 console.log(JSON.stringify(docs[0].openValue]); {"$numberDecimal":"119.800"}

Además, tuve problemas para enviar los resultados de la consulta, debido a res.json o res.send usando stringify. En su lugar, escribí una función de reemplazo y configuré la propiedad en Node.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!