Структура базы данных mongoDB для приложения

179
15 февраля 2018, 16:53

Есть сайт, на котором я нашел задачу на практику.

Хотел сделать хранение данных через mysql, но никак не мог связать таблицы, поэтому я выбрал mongoDB. Посмотрев документацию и пару видосиков по mongoDB, я получил базовые знания.
Далее сделал такую структуру:
- массив груп;
- каждая група состоит из названия(name), студентов(students) и предметов(subjects);
- каждый студент - объект, состоящий из ID, имя(firstName) и фамилии(lastName);
- каждый предмет состоит из названия(name) и массива уроков(lessons) - каждый урок состоит из даты(date) и оценок(marks)
- каждая оценка состоит из ID студента(studentID) и значения(value)

Пример груп в JSON формате: http://olegmisar.tk/files/data2.json

Но для вывода данных в приложении мне надо собрать все данные в другую структуру:
- массив груп - група состоит из названия(name), массива дат(dates) и студентов(students)
- студент состоит из имя(firstName), фамилии(lastName) и оценок(marks)
- оценки - массив чисел

Пример отформатированых груп: http://olegmisar.tk/files/data3.json

Сейчас я выбираю групы из БД и групирую данные с помощью js. Использую такой код:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:8090';
const dbName = 'register';
(async function () {
    try {
        const client = await MongoClient.connect(url);
        const db = client.db(dbName);
        const cursor = await db.collection('groups').aggregate();
        let groups = [];
        while(await cursor.hasNext()) {
            let group = await cursor.next();
            for (let subject of group.subjects) {
                let newSubject = {
                    name: subject.name,
                    dates: [],
                    students: []
                };
                for (let student of group.students) {
                    let index = newSubject.students.push(student) - 1;
                    newSubject.students[index].marks = [];
                }
                for (let lesson of subject.lessons) {
                    newSubject.dates.push(lesson.date);
                    for (let mark of lesson.marks) {
                        for (let student of newSubject.students) {
                            if (student._id !== mark.studentId) continue;
                            student.marks.push(mark.value);
                        }
                    }
                }
                groups.push(newSubject);
            }
        }
        client.close();
    } catch (err) {
        console.error(err);
    }
})();

В результате я получаю объект groups, в котором данные сгрупированые так, как мне нужно.

Вопросы:
- на сколько плох такой вариант хранения данных?
- можно ли сгрупировать эти данные при запросе к БД? Я имею ввиду aggregate/group команды
- какие есть еще варианты(структуры) хранения таких данных в БД?
- еще какие-то советы и критика приветствуются

READ ALSO
Проблема с обращением к value переменной

Проблема с обращением к value переменной

Прошу помочь в следующей проблеме: Имеем select с набором option`овСтоит задача в выборе option, у которого value равняется переменной pack, но при этом...

177
распарсить строку в JSON

распарсить строку в JSON

К примеру есть строка вида

158
Анимация для Inner HTML (Anime.js или альтернативы)

Анимация для Inner HTML (Anime.js или альтернативы)

Мне нужно сделать калькулятор для рассчёта стоимости видеороликаЕсть такой код:

127