带有嵌套可选对象的猫鼬模式
Posted
技术标签:
【中文标题】带有嵌套可选对象的猫鼬模式【英文标题】:Mongoose Schema with nested optional object 【发布时间】:2016-11-09 22:37:49 【问题描述】:使用以下架构:
data1: String,
nested:
nestedProp1: String,
nestedSub: [String]
当我new MyModel(data1: 'something).toObject()
显示新创建的文档时,如下所示:
'_id' : 'xxxxx',
'data1': 'something',
'nested':
'nestedSub': []
即嵌套文档是用空数组创建的。
如何使“嵌套”成为完全可选的 - 即,如果输入数据中没有提供它,则根本不创建?
我不想为“嵌套”使用单独的架构,不需要那种复杂性。
【问题讨论】:
【参考方案1】:以下架构满足我原来的要求:
data1: String,
nested:
type:
nestedProp1: String,
nestedSub: [String]
,
required: false
这样,如果未指定,新文档将使用“缺失”子文档创建。
【讨论】:
警告:这不是 Mongoose 中的有效架构。可能是在写这个答案的时候,但它不在当前版本中。见github.com/Automattic/mongoose/issues/8107【参考方案2】:你可以使用strict: false
new Schema(
'data1': String,
'nested':
,
,
strict: false
);
然后架构是完全可选的。要仅将 nested
设置为完全可选,您可以执行以下操作:
new Schema(
'data1': String,
'nested': new Schema(, strict: false)
);
但我从未尝试过
【讨论】:
谢谢,但这需要嵌套文档的架构。 请注意,将 strict 设置为 false 不仅仅是让事情变得可选:mongoosejs.com/docs/guide.html#strict【参考方案3】:没有额外 Schema 对象的解决方案可以使用如下钩子
MySchema.pre('save', function(next)
if (this.isNew && this.nested.nestedSub.length === 0)
this.nested.nestedSub = undefined;
next();
);
【讨论】:
很有趣,谢谢。不完全是我所希望的 - 我是在声明性模式定义之后。以上是关于带有嵌套可选对象的猫鼬模式的主要内容,如果未能解决你的问题,请参考以下文章