Mongoose 模式创建空数组字段
Posted
技术标签:
【中文标题】Mongoose 模式创建空数组字段【英文标题】:Mongoose schema creates empty array field 【发布时间】:2018-02-07 19:17:22 【问题描述】:在我的 Food
架构中,我有基于另一个名为 yummy
的字段的不同字段。例如:
yummy
等于pancake
,我的字段是dough
和jam
如果yummy
等于pizza
,我的字段是dough
、meat
和cheese
等等。它在保存文档时按预期工作 - 我只是传递了每个文档要保存的字段,因为除了 yummy
之外,它们都不需要。
所以如果我保存:
yummy: 'pizza'
dough: 'thin'
meat : 'peperroni',
cheese: [ObjectId("59a65a4f2170d90b0436ed4b")] // refs to the cheeses collection.
我的文档看起来像预期的那样。
问题在于type: Array
的字段。当我保存时:
yummy: 'pancake',
dough: 'thick',
jam: 'blueberry'
我的文档保存有一个额外的cheese: []
字段。在我的架构中,奶酪定义如下:
Mongoose.model('Food',
...
cheese:
type: [ type: Mongoose.Schema.ObjectId, ref: 'Cheese' ],
required: false
,
...
);
我检查了 mongo 是否需要文档将数组字段预定义为空,以防更新中使用 $push
- 它不需要。那么,问题来了:如何避免在保存时向文档添加空数组字段?
【问题讨论】:
这取决于您的架构,如果您的架构中定义了一个数组,它将在创建文档时创建一个空数组。如果你想玩两个版本的集合(一个有奶酪,一个没有),创建两个版本的架构look here 那么你找到什么了吗?我真的很感兴趣 我按照你的建议做了 - 玩了两个版本的集合,并为pizza
和 pancake
创建了单独的模式
你应该把你所做的作为答案并接受它,它实际上可以帮助你之后的一些人:) 干得好
或者,你应该这样做,这真的是你的答案。
【参考方案1】:
当您保存文档时,猫鼬会查看相关集合的架构。
它会获取您提供给它的所有字段并设置值。它还会为您没有提供任何内容的字段创建默认值。
这就是猫鼬的行为。
在你的情况下,我们能做什么?
我们将创建两个与同一个集合相关的模式。一份有奶酪,一份没有。因此,当您要使用没有 cheese
的架构保存新文档时,它不会被创建。
实际上,集合将包含两种不同的文档类型。
Here is a link about using multiple schema related to a single collection
【讨论】:
【参考方案2】:只需将default: undefined
设置为字段cheese
。根据this.
...
cheese:
type: [ type: Mongoose.Schema.ObjectId, ref: 'Cheese' ],
required: false,
default: undefined
,
...
【讨论】:
以上是关于Mongoose 模式创建空数组字段的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS Express Mongoose 返回空 []