【问题标题】:Mongoose schema creates empty array fieldMongoose 模式创建空数组字段
【发布时间】: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 创建了单独的模式
  • 你应该把你所做的作为答案并接受它,它实际上可以帮助你之后的一些人:) 干得好
  • 或者,你应该这样做,这真的是你的答案。

标签: javascript node.js mongoose mongoose-schema


【解决方案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
    },
    ...
    

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 2017-08-18
      • 2014-09-21
      • 2018-02-28
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多