2017-01-30 6 views
3

im numerischen Modell für die Geldwerte speichern, wobei der MongoDB docs Zustand:Extract Decimal aus NumberDecimal mit Mongo (OSE)

Aus der mongo Schal Dezimalwerte zugeordnet und abgefragt die NumberDecimal() Konstruktor.

Wenn Sie die Morphia Java-Bibliothek verwenden, werden BigDecimals automatisch als BigDecimals eingefügt.

Ich frage Mongo im Knoten mit Mongoose und versuche, den numerischen Wert eines Feldes, das als NumberDecimal gespeichert ist, zu extrahieren. Allerdings wird der Wert seltsam in Abfrageergebnissen eingewickelt und ich bin nicht sicher, wie es durch Mongo oder Mungo extrahieren:

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

Einen Beitrag las ich parseFloat() in meinem Anwendungscode angegeben verwendet wird ausführen, was ich will, aber Es ist nicht effizient, das Ergebnis zu durchlaufen, um diese Transformation durchzuführen. Das Vermeiden von Iterieren und Transformieren würde bedeuten, die Funktion auf den NumberDecimals immer dann auszuführen, wenn ich jedes Mal ihren Wert haben möchte, was lästig wäre.

Gibt es eine Möglichkeit, Mongo oder Mongoose zu verwenden, um das obige JSON-Abfrageergebnis in das Folgende zu konvertieren?

[ 
    { 
     "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" 
    } 
] 

Ich habe versucht, das Feld als ...openValue.$numberDecimal Auswahl, aber das hat nicht funktioniert. Vielen Dank!

Edit: Hier ist mein Mongoose Schema:

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 }); 

Hier ist der Mungo-Abfrage für die erste JSON Ergebnis über:

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

Können Sie Ihre Schema-Definition zeigen? – chridam

+0

@chridam Ich habe mein Schema und die Abfrage, die ich verwende, hinzugefügt! –

Antwort

0

Im Gegensatz zu dem, was ich erwartet hatte, es werden die Werte automatisch extrahiert scheint. Durch das Festlegen des Ergebnisses wird der Wert automatisch in NumberDecimal eingeschlossen. Sehen Sie den Code mit dem Ausgang manuell unten platziert:

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

Auch ich mit dem Senden von Abfrageergebnissen zu kämpfen, wegen res.json oder res.send stringify verwenden. Stattdessen habe ich eine Replace-Funktion geschrieben und die Eigenschaft in Node gesetzt.

0

Sie können auch die toJSON Methode überschreiben:

// 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; 
    }, 
});