首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Mongo(ose)从NumberDecimal中提取十进制

用Mongo(ose)从NumberDecimal中提取十进制
EN

Stack Overflow用户
提问于 2017-01-30 10:51:15
回答 2查看 10.2K关注 0票数 6

在用于存储货币价值的数字模型中,MongoDB文档状态:

从mongo中,使用NumberDecimal()构造函数分配并查询十进制值。

类似地,当使用Mor情as库时,BigDecimals将自动插入为BigDecimals。

我正在用Mongoose查询Node中的Mongo,并试图提取存储为NumberDecimal的字段的数值。但是,这个值被奇怪地封装在查询结果中,我不知道如何通过Mongo或Mongoose提取它:

代码语言:javascript
复制
[  
   {  
      "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查询结果转换为下面的内容?

代码语言:javascript
复制
[  
   {  
      "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,但这没有起作用。谢谢!

编辑:这是我的猫鼬模式:

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
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"
      }
   }
],
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-29 20:28:44

您还可以覆盖toJSON方法:

代码语言:javascript
复制
// 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;
  },
});
票数 6
EN

Stack Overflow用户

发布于 2017-01-30 22:03:33

与我所预期的相反,这些值似乎是自动提取的。对结果进行字符串化会自动包装NumberDecimal中的值。请参阅下面手动放置输出的代码:

代码语言:javascript
复制
console.log(docs[0].openValue);
119.800
console.log(JSON.stringify(docs[0].openValue]);
{"$numberDecimal":"119.800"}

另外,由于使用stringify的res.json或res.send,我很难发送查询结果。相反,我编写了一个替换函数,并在Node中设置了该属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41934046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档