Как правильно инициализировать документы в коллекции mongoose
-
02-01-2020 - |
Вопрос
Пожалуйста, поправьте меня, если мой дизайн не рекомендуется:
У меня есть модель для записей в блоге с полем "категория".Я хочу, чтобы пользователь мог ввести категорию (с помощью typeahead), и, если категории там нет, пользователь сможет ее создать.Однако, чтобы предотвратить неорганизованные записи, я хочу заполнить поле "категория" списком категорий.
Вопрос в том, должен ли я использовать поле "категория" в качестве массива или в качестве вложенного документа, ссылающегося на другую модель под названием "Категория"?Я предполагаю, что последний вариант был бы рекомендуемым дизайном, поскольку он позволяет избежать репликации кода и упрощает взаимодействие, необходимое пользователю для добавления новой категории.
Теперь, если я использую его с вложенными документами, как я мог бы инициализировать модель "Категория" списком категорий при запуске сервера?
Решение
Почему бы вам не использовать что-нибудь вроде этого?
//Category schema
//Store all the categories available in this collection
var categorySchema=new Schema({
_id:String,//name of category
description:String
//other stuff goes here
})
mongoose.model(categorySchema, 'Category')
//blog post schema
var postSchema=new Schema({
//all the relevant stuff
categories:[{type:String,ref:'Category'}]
})
Теперь всякий раз, когда вы публикуете blog post
, проверьте , работает ли categories
данные уже присутствуют в Category
коллекция.Это будет быстро, так как мы используем название категории(_id
) как сам индекс.Таким образом, для каждой новой категории, которую вы должны вставить в Category
сбор , а затем вставьте blog post
.Таким образом, вы можете populate
то categories
массив, если требуется.
Чтобы инициализировать категории, это можно сделать путем синтаксического анализа JSON
файл , который более удобочитаем .Файл должен быть проанализирован только тогда, когда мы начинаем с пустой базы данных, т.е. когда мы удаляем коллекцию категорий
Создайте категории.json-файл.Содержимое Categories.json:
[
{
_id:'Category1',//name of category
description:'description1'
...
},
{
_id:'Category2',//name of category
description:'description2'
...
},{
_id:'Category3',//name of category
description:'description3'
...
}
...
]
Чтобы прочитать данные из файла
fs=require('fs');
var buildCategories=fs.readFile(<path to Categories.json>,'utf8',function(err,data){
if (err) {
//logger.error(err);
return ;
}
var datafromfile=JSON.parse(data);
data.forEach(function(obj){
var catOb=new Category(obj)
obj.save(function(err,doc){..});
})
});
//To initialize when the Category collection is empty
Category.findOne({},function(err,doc){
if(!doc){
//Collection is empty
//build fomr file
buildCategories();
}
});
//Or you can just manually call the function whenever required when server starts
buildCategories();
Вы могли бы возразить, что можете импортировать csv-файл.Но именно так я поступил в своем проекте.