在用于存储货币价值的数字模型中,MongoDB文档状态:
从mongo中,使用NumberDecimal()构造函数分配并查询十进制值。
类似地,当使用Mor情as库时,BigDecimals将自动插入为BigDecimals。
我正在用Mongoose查询Node中的Mongo,并试图提取存储为NumberDecimal的字段的数值。但是,这个值被奇怪地封装在查询结果中,我不知道如何通过Mongo或Mongoose提取它:
[
{
"openValue":{
"$numberDecimal":"119.931"
},
"timestamp":"2017-01-20T10:30:00.000Z"
},
{
"openValue":{
"$numberDecimal":"119.965"
},
"timestamp":"2017-01-20T10:31:00.000Z"
}
]在我的应用程序代码中,我读到一篇文章说使用parseFloat()可以执行我想要的结果,但是迭代结果来执行这个转换是不有效的。避免迭代和转换意味着每次我想要在NumberDecimals上运行函数时都要运行它们的值,这是很烦人的。
我是否可以使用Mongo或Mongoose将上述JSON查询结果转换为下面的内容?
[
{
"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"
}
]我试着选择字段为...openValue.$numberDecimal,但这没有起作用。谢谢!
编辑:这是我的猫鼬模式:
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 });下面是上面第一个JSON结果的Mongoose查询:
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"
}
}
],发布于 2017-11-29 20:28:44
您还可以覆盖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;
},
});发布于 2017-01-30 22:03:33
与我所预期的相反,这些值似乎是自动提取的。对结果进行字符串化会自动包装NumberDecimal中的值。请参阅下面手动放置输出的代码:
console.log(docs[0].openValue);
119.800
console.log(JSON.stringify(docs[0].openValue]);
{"$numberDecimal":"119.800"}另外,由于使用stringify的res.json或res.send,我很难发送查询结果。相反,我编写了一个替换函数,并在Node中设置了该属性。
https://stackoverflow.com/questions/41934046
复制相似问题