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 ?
Best Answer
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()
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)
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.