Как правильно инициализировать документы в коллекции mongoose

StackOverflow https://stackoverflow.com//questions/25091473

Вопрос

Пожалуйста, поправьте меня, если мой дизайн не рекомендуется:

У меня есть модель для записей в блоге с полем "категория".Я хочу, чтобы пользователь мог ввести категорию (с помощью 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-файл.Но именно так я поступил в своем проекте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top