Hola a todos aquí, cualquiera puede ayudarme con la consulta a continuación.
El problema es
alguien me puede dar la solucion
lessonModel.aggregate([ { $match : {'quiz.status':1 } }, { $lookup : { from : 'quiz', let : { 'lesson_id' : '$_id','limit' : '$quiz.amount' }, pipeline : [ { $match: { $expr: { $eq: [ "$lesson_id", "$$lesson_id" ] } } }, { $project: { title:1, check_list:1, duration:1 } }, { $sample: { size: '$$limit' } } ], as: 'quiz' } }, {$unwind: '$quiz'}, { $replaceRoot: { newRoot: "$quiz" } } ]).exec();El error decía que el argumento de tamaño para $muestra debe ser un número
ACTUALIZAR
Creo que su principal problema es elegir al azar la amount de quiz en cada lección. Dado que $sample no es útil, use $function (Nuevo en la versión MongoDB 4.4).
Solución
Dentro del operador $function escriba algo de lógica para
amount ) de preguntas requeridas. db.lessons.aggregate([ { $match: { "quiz.status": 1 } }, { $lookup: { from: "quiz", let: { "lesson_id": "$_id" }, pipeline: [ { $match: { $expr: { $eq: ["$lesson_id", "$$lesson_id"] } } }, { $project: { title: 1, check_list: 1, duration: 1 } } ], as: "questions" } }, { $project: { quiz: { $function: { body: function(questions, amount) { if (amount == 0) return []; for (let i = questions.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [questions[i], questions[j]] = [questions[j], questions[i]]; } return questions.slice(0, amount); }, args: ["$questions", { $ifNull: ["$quiz.amount", 0] }], lang: "js" } } } }, { $unwind: "$quiz" }, { $replaceRoot: { newRoot: "$quiz" } } ]); $sample no admite variables. Un número debe especificarse explícitamente como:
{ $sample: { size: 1 } } También reemplace su let como se muestra a continuación porque el último documento de la lesson no tiene una amount archivada en el objeto de quiz
let: { 'lesson_id': '$_id', 'limit': { $ifNull: ['$quiz.amount', 0] } // or any other number. },Equivocado:
{ $sample: { size: "$$limit" } // Wont work! }