2017-01-30 36 views
3

在數字模型,用於存儲貨幣值,所述MongoDB docs狀態:提取小數與蒙哥(OSE)

從蒙戈殼十進制值被分配,並使用NumberDecimal()構造查詢。

同樣,使用Morphia Java庫時,BigDecimals會自動插入爲BigDecimals。

我用Mongoose在Node中查詢Mongo,並試圖提取存儲爲NumberDecimal的字段的數值。然而,該值奇怪的包裹在查詢結果中,我不知道如何提取它通過蒙戈或貓鼬:

[ 
    { 
     "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結果上面的貓鼬查詢:

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" 
     } 
    } 
], 
+0

你能告訴你的模式定義? – chridam

+0

@chridam我添加了我的模式和我正在使用的查詢! –

回答

0

出乎我所料,看來值自動提取。自動將結果字符串包裝爲NumberDecimal中的值。看到代碼具有低於手動放置的輸出:

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

另外,我與發送的查詢結果掙扎,由於res.json或res.send使用字符串化。相反,我寫了一個替換函數並在Node中設置了屬性。

0

您也可以覆蓋toJSON方法:

// Never return '__v' field and return the actual 'price' value in the JSON representation 
// Note that this doesn't effect `toObject` 
EquityHistoryModel.set('toJSON', { 
    getters: true, 
    transform: (doc, ret) => { 
    ret.price = ret.price.$numberDecimal; 
    delete ret.__v; 
    return ret; 
    }, 
});