Closed ystreibel closed 1 year ago
I'm a bit confused by what you mean because your require steps
in your schema
Simplified the schema so its easier to look at.
const mongoose = require('mongoose');
const { Schema } = mongoose;
var CollectSchema = new Schema({
name: String,
steps: { type: [{
inputMethod: { type: {
name: String,
keyboardSettings: {
hideAlt: {type: Boolean, required: true},
hideCaps: {type: Boolean, required: true},
visualFeedback: {type: {
global: {type: Boolean, required: true},
keys: {type: Boolean, required: true}
}, required: true},
theme: {type: {
completeBackgroundColor: {type: String, required:true},
suggestBarBackgroundColor: {type: String, required:true},
pressKeyBackgroundColor: {type: String, required:true},
suggestBarSeparatorColor: {type: String, required:true},
alternateKeysColor: {type: String, required:true},
toggleButtonColor: {type: String, required:true},
toolBarColor: {type: String, required:true},
oolCandidateColor: {type: String, required:true},
lastCandidateColor: {type: String, required:true},
keysColor: {type: String, required:true},
inkColor: {type: String, required:true},
bestCandidateColor: {type: String, required:true},
sendKeyColor: {type: String, required:true},
enlargePressKeyViewColor: {type: String, required:true}
}, required: true}
},
}, required: true},
}], required: true}
},
{
id: false
});
const Test = mongoose.model('Test', CollectSchema);
async function run() {
await mongoose.connect('mongodb://localhost:27017');
await mongoose.connection.dropDatabase();
await Test.create({
name: 'Test Doc',
steps: [{
inputMethod: {
name: 'Test Subdoc',
}
}]
});
}
run();
This is expected behavior, see subdocuments vs nested paths in our docs. Replace keyboardSettings: { ... }
with keyboardSettings: { type: { ... } }
var CollectSchema = new Schema({
name: String,
steps: { type: [{
inputMethod: { type: {
name: String,
keyboardSettings: {type: {
hideAlt: {type: Boolean, required: true},
hideCaps: {type: Boolean, required: true},
visualFeedback: {type: {
global: {type: Boolean, required: true},
keys: {type: Boolean, required: true}
}, required: true},
theme: {type: {
completeBackgroundColor: {type: String, required:true},
suggestBarBackgroundColor: {type: String, required:true},
pressKeyBackgroundColor: {type: String, required:true},
suggestBarSeparatorColor: {type: String, required:true},
alternateKeysColor: {type: String, required:true},
toggleButtonColor: {type: String, required:true},
toolBarColor: {type: String, required:true},
oolCandidateColor: {type: String, required:true},
lastCandidateColor: {type: String, required:true},
keysColor: {type: String, required:true},
inkColor: {type: String, required:true},
bestCandidateColor: {type: String, required:true},
sendKeyColor: {type: String, required:true},
enlargePressKeyViewColor: {type: String, required:true}
}, required: true}
} },
}, required: true},
}], required: true}
},
{
id: false
});
Sorry, but that is not the expected behavior?
keyboardSettings
should not be required, but if it's declare, sub-documents values should!
If you define your schema as follows, then keyboardSettings
will not be required, but the subdocument properties will be required if keyboardSettings
is set
keyboardSettings: {
type: {
hideAlt: {type: Boolean, required: true},
hideCaps: {type: Boolean, required: true},
// ...
},
required: false
}
Prerequisites
Mongoose version
7.1.0
Node.js version
16.13.1
MongoDB server version
7.0
Typescript version (if applicable)
No response
Description
Document schema has an array of sub-documents, for example in CollectSchema,
steps.inputMethod.KeyboardSetting
. This sub-document in array item is not required but its properties are.Since 7.1.0, I have a validation error.
Steps to Reproduce
Create a Schema with an array of non required sub-documents within required properties. Try to
save()
a document.Expected Behavior
I expect to not have required validation error for non required sub-document within required properties.