Normal
Normal

Reputation: 3746

omit empty strings fields mongoose

I have the following schema:

const mySchema = new mongoose.Schema({
   x: String,
   y: String
})

when a user from the front-end requests in his body:

req.body = {
   'x' : '',
   'y': ''
}

this results in creating a field in MongoDB, but with an empty string. I need a way to prevent this behavior by setting the empty strings to be undefined somehow.

Is there such an option in Mongoose? or do I have to predict my own middlewares for that?

Upvotes: 1

Views: 681

Answers (2)

Tom
Tom

Reputation: 191

You could use the set method for Mongoose Schemas:

const mySchema = new mongoose.Schema(
  {
    myAttribute: {
      type: String,
      set: (attribute: string) => attribute === '' ? undefined : attribute,
    },
  },
  { strict: 'throw' },
);

This will unset the field if the string equals ''.

Use this to trim the strings: set: (a: string) => a?.trim() === '' ? undefined : a

Upvotes: 2

PsiKai
PsiKai

Reputation: 1978

You don't need mongoose, or a middleware to handle this. You can just write a quick few lines to check for empty values and exclude them from the MongoDB write operation.

Ex:

const newEntry = Object.entries(req.body).reduce((obj, [key, value]) => {
  if (value) obj[key] = value
  return obj
}, {})

In this example, I convert the req.body into an array using Object.entries and iterate over it with the Array.reduce method, wherein I add key:value pairs to a new object if there is a value to add. Since an empty string value is falsey I can do a simple if check on the value. I then assign the return of the reduce method to the variable newEntry. Then I would then take the new entry and create the MongoDB document with it.

This could be extracted into a helper method and reused in any of your routes that need to check remove empty values from an object.

Docs on Array.reduce

Docs on Object.entries

Upvotes: 0

Related Questions