У меня есть приложение-викторина, в котором схемы следующие: схема викторины -
const quizSchema = new mongoose.Schema({
userID: {
type: String,
required: [true, 'User ID required']
}
});
Схема ответа -
const responseSchema = new mongoose.Schema({
userID: {
type: String,
required: [true, 'User ID required']
},
quizID: {
type: String,
required: [true, 'Quiz ID required']
}
});
Схема ответа содержит ответы пользователя на викторину, т.е. если попытка выполнить викторину, то только она сохраняется в схеме ответа.
Я могу легко узнать, какой тест сделал пользователь, используя
const attempted = await Response.find({userID});
Вот как я это сделал, используя простую логику:
exports.unattemptedQuizDB = async (userID) => {
try{
const quizzes = await Quiz.find({});
const filtered = [];
for (const quiz of quizzes){
const inResponse = await Response.find({userID:userID, quizID: quiz._id});
if (inResponse.length === 0){
filtered.push(quiz._id);
}
}
return filtered;
}catch(e){
throw new Error(e);
}
};
Но как мне найти непрошенные викторины с помощью агрегирования?
да, это то, что я хочу получить, если QuizID для пользователя отсутствует в коллекции ответов, это не попытка
Это строка quiz._id?





Ниже представлен запрос агрегирования для написанной вами логики:
let responses = await Quiz.aggregate([
{
$lookup: {
from: "responses",
let: {
userID: "$userID",
quizID: { $toString: "$_id" }
},
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$userID", "$$userID"] },
{ $eq: ["$quizID", "$$quizID"] }
]
}
}
}
],
as: "responses"
}
},
{
$match: {
"responses": { $eq: [] }
}
}
]);
Мне трудно понять, хотя я понимаю одну вещь: приведенный выше код возвращает запросы, если идентификатор пользователя отсутствует в коллекции ответов, верно?
Проверьте обновленный ответ. Он получит все документы из коллекции quizzes, которые не пытались использовать пользователи из коллекции responses.
Но в непроверенных викторинах не будет записей в коллекции
responses, верно? Также присутствует лиquizIDвresponsesв коллекцииquizzes?