Почему 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
},
Это будет хранить пустой объект вместо массива.