Mongoose 模式创建空数组字段

Posted

技术标签:

【中文标题】Mongoose 模式创建空数组字段【英文标题】:Mongoose schema creates empty array field 【发布时间】:2018-02-07 19:17:22 【问题描述】:

在我的 Food 架构中,我有基于另一个名为 yummy 的字段的不同字段。例如:

如果yummy 等于pancake,我的字段是doughjam 如果yummy等于pizza,我的字段是doughmeatcheese

等等。它在保存文档时按预期工作 - 我只是传递了每个文档要保存的字段,因为除了 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 那么你找到什么了吗?我真的很感兴趣 我按照你的建议做了 - 玩了两个版本的集合,并为 pizzapancake 创建了单独的模式 你应该把你所做的作为答案并接受它,它实际上可以帮助你之后的一些人:) 干得好 或者,你应该这样做,这真的是你的答案。 【参考方案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 返回空 []

Mongoose更新嵌套数组

Mongoose 查询返回带有空数组的嵌套文档

使用 mongoose 保存子文档数组会创建空数组 MEAN 堆栈

文档中的空白字段会占用 Mongoose 的空间吗?

Mongoose 不尊重模式并插入错误的数据类型