Mongoose模式创建空数组字段

时间:2017-08-30 07:15:48

标签: javascript node.js mongoose mongoose-schema

在我的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: []字段。在我的模式中,cheese定义如下:

Mongoose.model('Food', {
    ...
    cheese: { 
        type: [{ type: Mongoose.Schema.ObjectId, ref: 'Cheese' }], 
        required: false 
    },
    ...
});

我检查了mongo是否需要doc将数组字段预定义为空,以防更新中使用$push - 它没有。所以,问题是:如何避免在保存时向文档添加空数组字段?

2 个答案:

答案 0 :(得分:5)

当您保存文档时,猫鼬会查看相关集合的架构。

它会占用您提供的所有字段并设置值。它还为您没有提供任何内容的字段创建默认值。

这就是猫鼬的行为。

在您的情况下,我们可以做些什么?

我们将创建与同一集合相关的两个架构。一个用野外奶酪,一个没有。因此,当您使用没有cheese的架构保存新文档时,它将不会被创建。

实际上,该集合将包含两种不同的文档类型。

Here is a link about using multiple schema related to a single collection

答案 1 :(得分:0)

只需将 default: undefined 设置为字段 cheese。根据{{​​3}}。

...
cheese: { 
   type: [{ type: Mongoose.Schema.ObjectId, ref: 'Cheese' }], 
   required: false,
   default: undefined
},
...