Почему Mongoose добавляет пустые массивы?

Я пытаюсь использовать Mongoose в качестве ODM для MongoDB с помощью моего приложения node.js. Я заметил, что когда я разрабатываю схему со встроенным документом, если я не добавляю к ней значение, он сохраняет пустой массив "[]" в Mongo. Почему это? Я пытаюсь сохранить исторические изменения в записях, а пустой массив будет означать, что это изменение удалило значение. Вот примерная схема.

schema.Client = new mongoose.Schema({
    name:{type:String, required:true},
    products:[{
        name:{type:String, index:true},
        startDate:Date,
        endDate:Date
    }],
    subdomain:{type:String, index:{unique:true}},
})

Вот результирующий документ, когда я сохраняю документ только с именем и субдоменом.

{
    "name": "Smith Company",
    "products": [],
    "subdomain": "smith"
}

Почему он по умолчанию добавлял продукты с пустым массивом и как я могу остановить его?

Ответы

Ответ 1

Пустой массив предоставляет удобный способ добавления или удаления элементов из вашей модели.

$push $addToSet $pull в обновлении поможет вам управлять элементами массива.

Если у вас нет пустого массива, вы не можете нажимать элементы на null

Но это возможно в пустом массиве.

Ответ 2

Это похоже на дизайн, но здесь используется обходной путь с использованием обработчика 'pre' для удаления пустого массива по умолчанию: https://github.com/LearnBoost/mongoose/issues/1335

Это работало только для меня, когда я установил поле в null. Если я установил его в undefined, как в примере кода, кажется, что пустой массив возвращается.

Ответ 3

Вы можете обходным путем определить схему, как показано ниже:

products: {
  type: [{
    name:String,
    startDate:Date,
    endDate:Date
  }],
  default: undefined
}

Ответ 4

Потому что в вашей схеме вы определяете продукты как массив объектов. Вам нужно попробовать что-то вроде:

products: {
        name:{type:String, index:true},
        startDate:Date,
        endDate:Date
    },

Это будет хранить пустой объект вместо массива.