Object type in mongoose

MongodbMongooseMongodb Query

Mongodb Problem Overview


I am defining a mongoose schema and definition is as follows:

   inventoryDetails: {
        type: Object,
        required: true

    },
    isActive:{
        type:Boolean,
        default:false
    }

I tried "Object" type and I am seeing my data is getting saved successfully. When I changed type to array, the save is failing.

Sample Data:

{
    "inventoryDetails" : { 
        "config" : { 
            "count" : { 
                "static" : { "value" : "123" }, 
                "dataSource" : "STATIC" 
            }, 
            "title" : { 
                "static" : { "value" : "tik" }, 
                "dataSource" : "STATIC" 
            } 
        }, 
        "type" : "s-card-with-title-count" 
    } 
}

"Object" type is not one of the types that mongoose allows. But, how it is being supported ?

Mongodb Solutions


Solution 1 - Mongodb

You have two options to get your Object in the db:

1. Define it by yourself
let YourSchema = new Schema({
  inventoryDetails: {
    config: {
      count: {
        static: {
          value: {
            type: Number,
            default: 0
          },
          dataSource: {
            type: String
          }
        }
      }
    },
    myType: {
      type: String
    }
  },
  title: {
    static: {
      value: {
        type: Number,
        default: 0
      },
      dataSource: {
        type: String
      }
    }
  }
})

Take a look at my real code:

let UserSchema = new Schema({
  //...
  statuses: {
    online: {
      type: Boolean,
      default: true
    },
    verified: {
      type: Boolean,
      default: false
    },
    banned: {
      type: Boolean,
      default: false
    }
  },
  //...
})

This option gives you the ability to define the object's data structure.

If you want a flexible object data structure, see the next one.

2. Use the default Schema.Types.Mixed type

Example taken from the doc:

let YourSchema = new Schema({
  inventoryDetails: Schema.Types.Mixed
})

let yourSchema = new YourSchema;

yourSchema.inventoryDetails = { any: { thing: 'you want' } }

yourSchema.save()

Solution 2 - Mongodb

Mongoose 5

An "anything goes" SchemaType. Mongoose will not do any casting on mixed paths. You can define a mixed path using Schema.Types.Mixed or by passing an empty object literal. The following are equivalent.

const Any = new Schema({ any: {} });
const Any = new Schema({ any: Object });
const Any = new Schema({ any: Schema.Types.Mixed });
const Any = new Schema({ any: mongoose.Mixed });

For your current schema you can use the next example:

import mongoose from 'mongoose'

const inventorySchema = mongoose.Schema({
  inventoryDetails: {
    type: mongoose.SchemaTypes.Mixed,
    required: true
  },
  isActive:{
    type: Boolean,
    default:false
  }
})

const inventory = await inventorySchema.create({
  inventoryDetails: { 
    config: { 
      count: { 
        static: { value: '123' }, 
        dataSource: 'STATIC' 
      }, 
      title: { 
        static: { value: 'tik' }, 
        dataSource: 'STATIC' 
      } 
    }, 
    type: 's-card-with-title-count' 
  }
})

console.log(inventory)

Solution 3 - Mongodb

From the mongoose docs: https://mongoosejs.com/docs/schematypes.html#what-is-a-schematype

...// anything: Schema.Types.Mixed //...

Mixed is an "anything goes" schema type. The following are equivalent.

const Any = new Schema({ any: {} });
const Any = new Schema({ any: Object });
const Any = new Schema({ any: Schema.Types.Mixed });
const Any = new Schema({ any: mongoose.Mixed });

So, I think that's why setting type:Object worked.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncodewarriorView Question on Stackoverflow
Solution 1 - MongodbJustinView Answer on Stackoverflow
Solution 2 - MongodbAndres SeparView Answer on Stackoverflow
Solution 3 - MongodbShashwat ShauryaView Answer on Stackoverflow