Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

175
Visualizações
La agregación de Mongodb pasa el argumento al tamaño del elemento de $sample

Hola a todos aquí, cualquiera puede ayudarme con la consulta a continuación.

  • Quiero obtener una lista de cuestionarios con una cantidad aleatoria
  • la cantidad de rendom se basará en cada lección

El problema es

  • mongodb no permite pasar el argumento al tamaño del elemento de $ muestra

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

Aquí están mis datos de muestra Data de muestra

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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

  1. Mezcla las preguntas (puedes cambiarlo según tus necesidades).
  2. Córtelo para devolver el número ( 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! }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda