Mongoose Schema with nested optional object

僤鯓⒐⒋嵵緔 提交于 2019-12-05 22:51:38

问题


Using the following schema:

{
  data1: String,
  nested: {
    nestedProp1: String,
    nestedSub: [String]
  }
}

When I do new MyModel({data1: 'something}).toObject() shows the newly created document like this:

{
  '_id' : 'xxxxx',
  'data1': 'something',
  'nested': {
    'nestedSub': []
  }
}

I.e. the nested document is created with the empty array.

How do I make "nested" to be fully optional - i.e. not created at all if it is not provided on the input data?

I do not want to use a separate schema for the "nested", no need of that complexity.


回答1:


The following schema satisfies my original requirements:

{
  data1: String,
  nested: {
    type: {
       nestedProp1: String,
       nestedSub: [String]
    },
    required: false
  }
}

With this, new docs are created with "missing" subdocument, if one is not specified.




回答2:


You can use strict: false

new Schema({
    'data1': String,
    'nested': {
    },
}, 
{
    strict: false
});

And then the schema is fully optional. To set only nested as fully optional maybe you can do something like:

new Schema({
    'data1': String,
    'nested': new Schema({}, {strict: false})
});

But I have never tried




回答3:


A solution without additional Schema object could use a hook like the following

MySchema.pre('save', function(next) {
  if (this.isNew && this.nested.nestedSub.length === 0) {
      this.nested.nestedSub = undefined;
  }
  next();
});


来源:https://stackoverflow.com/questions/38248365/mongoose-schema-with-nested-optional-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!