how should i store a price in mongoose?

currency, mongoose, node.js

Solution

A bit late but...

The answer of chovy almost worked for me – I just needed to add `{ toJSON: { getters: true }}` as an options parameter in the schema declaration.

Example:

import mongoose from 'mongoose'
const productosSchema = new mongoose.Schema(
    {
        name: String,
        price: {
            type: Number,
            get: v => (v/100).toFixed(2),
            set: v => v*100
        }
    },
    { 
        toJSON: { getters: true } //this right here
    }
);
export default mongoose.model('productos', productosSchema)

This works on Mongoose 6.0.14.

References: https://mongoosejs.com/docs/api.html#document_Document-toJSON

Problem

I'm using mongoose schemas for node.js along with express-validator (which has node-validator santiziations and validators). What's a good way to store price for an item? I currently have ``` var ItemSchema = new Schema({ name : { type: String, required: true, trim: true } , price : Number }); ``` Price is optional, so I have: ``` if ( req.body.price ) { req.sanitize('price').toFloat(); req.assert('price', 'Enter a price (number only)').isFloat(); } ``` express-validator gives me isNumeric (allows 0 padding), isDecimal, and isInt...I'd rather just convert to decimal and strip all characters, so I'm always inserting 42.00 into db. I want to allow them to enter $42.00, $42, 42, 42.00 and just store 42.00. How can I accomplish this? and still validate that I'm seeing something resembling a number, for example if they enter 'abc' I want to throw an error back to the form using req.assert. Also, I suppose currency will eventually become an issue... Update, I found this post which says to store price as integer in cents, so 4200 https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use I just need a way to convert 4200 to $42.00 when I call item.price and also sanitize and convert the input into 4200.

Original source