Схема Mongoose создает пустое поле массива

В моей схеме 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 
    },
    ...
});

Я проверил, нужно ли монго, чтобы в документе поле массива было предопределено как пустое в случае использования $push в обновлении - это не так. Итак, вопрос: как мне избежать добавления пустого поля массива в мой документ при сохранении?


person wscourge    schedule 30.08.2017    source источник
comment
Это зависит от вашей схемы, если в вашей схеме определен массив, он создаст пустой массив при создании документа. Если вы хотите поиграть с двумя версиями коллекции (одна с сыром, другая без), создайте две версии схемы смотрите здесь   -  person Orelsanpls    schedule 30.08.2017
comment
Так ты что-то нашел? мне действительно интересно   -  person Orelsanpls    schedule 31.08.2017
comment
Я сделал, как вы предложили - поиграл с двумя версиями коллекции и создал отдельные схемы для pizza и pancake   -  person wscourge    schedule 31.08.2017
comment
Вы должны поставить то, что вы сделали, в качестве ответа и принять его, это действительно может помочь некоторым людям после вас :) Хорошая работа   -  person Orelsanpls    schedule 01.09.2017
comment
Или вы должны сделать это, это действительно ваш ответ.   -  person wscourge    schedule 01.09.2017


Ответы (2)


Когда вы сохраняете документ, мангуст просматривает схему связанной коллекции.

Он принимает все поля, которые вы ему даете, и устанавливает значения. Он также создает значения по умолчанию для полей, для которых вы ничего не указали.

Это поведение мангуста.


Что мы можем сделать в вашем случае?

Мы собираемся создать две схемы, связанные с одной и той же коллекцией. Один с сыром и один без. Поэтому, когда вы сохраните новый документ со схемой без cheese, он не будет создан.


На практике коллекция будет содержать два разных типа документов.

Вот ссылка об использовании нескольких схем, связанных с одной коллекцией< /а>

person Orelsanpls    schedule 01.09.2017

Просто установите default: undefined в поле cheese. Согласно этому.

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