Я думаю, начнем с основ, и, надеюсь, повсюду сплоченность. Кажется, что каждая следующая часть работает сама по себе, вы можете обнаружить, что вместе имеет смысл хранить некоторые вещи в документах, а не в своей собственной коллекции, или поддерживать вложенные коллекции, а не корневые коллекции и т. Д.:
- Каждый тест может иметь свой собственный документ в коллекции тесты .
- Каждый вопрос (с его потенциальными ответами) может иметь свойсобственный документ в коллекции вопрос .
- Каждый ответ на вопрос может иметь собственный документ в коллекции ответов , чтобы избежать хранения ответас вопросом.
- Каждый пользователь, пользователи
- Ответы каждого пользователя, пользователей / опросов
Вы можете рассмотреть возможность вложения вопросов в тесты, но, возможно, вы захотите оставить их корневыми, чтобы вы могли легко повторно использовать вопросы для нескольких тестов.
Поэтому, возможно, стоит сохранить массив в документе каждого вопроса, для которого тесты будут заданы. n принадлежит.
Затем вы можете выполнить запрос, подобный этому, чтобы получить все вопросы для викторины:
db.collection('questions').where('quizzes','array-contains', quizId)
Это даст вам все вопросы для каждого теста и удовлетворит ваш второй запрос (и 1-й уже удовлетворен).
Вопросы будут приходить с их потенциальными ответами, и я думаю, что каждый должен получить свой собственный идентификатор. Например:
-- question1
----- "Do you xyz?"
----- potentialAnswers
--------- { id: xyz123, answer: "Yes" }
--------- { id: wxy456, answer: "No" }
Это позволяет вам брать каждый ответ, который дает пользователь, и запрашивать, есть ли совпадение в вашей базе данных ответов.
Мне это нравитсяпока, потому что это позволяет вам запрашивать все вопросы, и вы получаете все возможные ответы в одном запросе / одном организованном списке. Вы можете переставить потенциальные ответы при их отображении, поэтому «С» на каждом дисплее множественного выбора не обязательно должен быть всегда одним и тем же «С». До тех пор, пока идентификатор совпадает, когда вы идете на сравнение, вы уверены.
Это сравнение может выглядеть так:
db.collection('answers').where('questionId','==', 'question1').where('answerId', '==', 'xyz123')
Если вы получите документ, возвращенный с запросомтаким образом, они ответили правильно.
Для каждого ответа, который дает пользователь, я бы отмечал его в подгруппе каждого пользователя, где quizId - это идентификатор документа. Таким образом, под user1 у них будет коллекция, называемая викторинами.
Когда пользователь отвечает, вы можете нажать на карту в документе викторины этого пользователя ответ, который он дал. Это может выглядеть следующим образом:
-- user1
----- quizzes
-------- quiz1
----------- progress: 2/25
----------- complete: true
----------- score: 1/2
----------- answers
-------------- { questionId: question1, answer: xyz123, correct: true }
-------------- { questionId: question2, answer: rst456, correct: false }
Для каждого теста, который вы хотите, чтобы пользователь прошел, если документ с таким идентификатором не находится в {userID} / quizzes} с complete = true, он может запустить егоили продолжайте принимать и т. д.
Это больше, чем получает большинство людей, поэтому надеюсь, что это полезно. Некоторые вещи, возможно, нужно прояснить немного больше, а другие могут иметь разные мнения, но мне нравятся эти упражнения.