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" } } ],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; }, });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.