¿Debo devolver una matriz o datos uno por uno en Mangosta?

Tengo esta aplicación simple que creé usando IOS, es una aplicación de cuestionario, siempre que el usuario haga clic en reproducir, invocará una solicitud a node.js / servidor express

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

Técnicamente, después de que un usuario haga clic en una respuesta, pasará a la siguiente pregunta.

introduzca la descripción de la imagen aquí

Estoy confundido de usar qué método, para obtener las preguntas / preguntas

  1. obtenga todos los datos a la vez y preséntelos al usuario, que es una matriz
  2. Obtenga los datos uno por uno a medida que el usuario avanza con la siguiente pregunta, que es un dato por llamada

Ejemplos de API

// Fetch all the data at once app.get('/api/questions', (req, res, next) => { Question.find({}, (err, questions) => { res.json(questions); }); }); // Fetch the data one by one app.get('/api/questions/:id', (req, res, next) => { Question.findOne({ _id: req.params.id }, (err, question) => { res.json(question); }); }); 

El problema con el enfoque número 1 es que, digamos que hay 200 preguntas, ¿no sería lento para mongodb buscar de una vez y posiblemente lento hacer la solicitud de red?

El problema con el enfoque del número 2, simplemente no puedo imaginar cómo hacerlo, porque cada pregunta es independiente y para activar la próxima llamada a la API es simplemente extraño, a menos que haya un contador o un nivel en la pregunta mongodb.

Para mayor claridad, esta es la pregunta de diseño de la base de datos en Mongoose

 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const QuestionSchema = new Schema({ question: String, choice_1: String, choice_2: String, choice_3: String, choice_4: String, answer: String }); 

Usaría el enfoque de Dave, pero voy a entrar un poco más en detalles aquí. En tu aplicación, crea una matriz que contendrá las preguntas. Luego, también almacene un valor en el cual el usuario está actualmente, llámelo index por ejemplo. Entonces tienes el siguiente pseudocódigo:

 index = 0 questions = [] 

Ahora que tiene esto, tan pronto como el usuario inicie la aplicación, cargue 10 preguntas (vea la respuesta de Dave, use la omisión y el límite de MongoDB para esto), luego agréguelas a la matriz. Servir questions [index] a su usuario. Tan pronto como el índice llegue a 8 (= 9ª pregunta), cargue 10 preguntas más a través de su API y agréguelas a la matriz. De esta manera, siempre tendrás preguntas disponibles para el usuario.

Muy buena pregunta. Supongo que la respuesta a esta pregunta depende de sus planes futuros sobre esta aplicación.

Si planea tener 500 preguntas, entonces obtenerlas una por una requerirá 500 llamadas api. No siempre la mejor opción. Por otro lado, si los captas todos a la vez, retrasará la respuesta dependiendo del tamaño de cada objeto.

Así que mi sugerencia será usar la paginación. Traiga 10 resultados, cuando el usuario llegue a la octava pregunta, actualice la lista con las siguientes 10 preguntas.

Esta es una práctica común entre los desarrolladores móviles, esto también le dará la flexibilidad para actualizar las siguientes preguntas sobre la base de las respuestas anteriores del usuario. Como prueba adaptativa y todo.

EDITAR

Puede agregar el parámetro de consulta pageNumber y pageSize en su solicitud para obtener preguntas del servidor, algo como esto.

 myquestionbank.com/api/questions?pageNumber=10&pageSize=2 

recibir estos parámetros en el servidor

 var pageOptions = { pageNumber: req.query.pageNumber || 0, pageSize: req.query.pageSize || 10 } 

y mientras consulta desde su base de datos proporcione estos parámetros adicionales.

 Question.find() .skip(pageOptions.pageNumber * pageOptions.pageSize) .limit(pageOptions.pageOptions) .exec(function (err, questions) { if(err) { res.status(500).json(err); return; }; res.status(200).json(questions); }) 

Nota: comience su número de página con cero (0) no es obligatorio, pero esa es la convención.

skip() método skip() te permite saltar los primeros n resultados. Considere el primer caso, pageNumber será cero, por lo que el producto ( pageOptions.pageNumber * pageOptions.pageSize ) se convertirá en cero, y no omitirá ningún registro. Pero para la próxima vez (pageNumber = 1) el producto tendrá un resultado de 10. por lo que saltará los primeros 10 resultados que ya se procesaron.

limit() este método limita el número de registros que se proporcionarán en el resultado.

Recuerde que deberá actualizar la variable pageNumber con cada solicitud. (aunque también puede variar el límite, pero se recomienda mantenerlo igual en todas las solicitudes)

Por lo tanto, todo lo que tiene que hacer es que, tan pronto como el usuario llegue a la segunda pregunta, puede solicitar 10 (tamaño de página) más preguntas del servidor como lo puso en su matriz.

Código de referencia: aquí .

Tienes razón, la primera opción es una opción de never-to-use en mi opinión también. Recuperar tantos datos es inútil si no se usa o tiene la oportunidad de no ser usado en el contexto. Lo que puedes hacer es que puedas exponer una nueva llamada a la API:

 app.get('/api/questions/getOneRandom', (req, res, next) => { Question.count({}, function( err, count){ console.log( "Number of questions:", count ); var random = Math.ceil(Math.random() * count); // random now contains a simple var now you can do Question.find({},{},{limit:1,skip:random}, (err, questions) => { res.json(questions); }); }) }); 

El skip:random se asegurará de que cada vez que se busca una pregunta aleatoria. Esta es solo una idea básica de cómo obtener una pregunta aleatoria de todas sus preguntas. Puede poner más lógicas para asegurarse de que el usuario no reciba ninguna pregunta que ya haya resuelto en los pasos anteriores.

Espero que esto ayude 🙂

Puedes usar el concepto de límite y saltar en mongodb.

cuando golpeas la api por primera vez, puedes tener tu límite = 20 y saltar = 0 incrementa tu cuenta de saltos cada vez que vuelvas a api.

1ª vez => límite = 20, saltar = 0

cuando haces clic en siguiente => límite = 20, salta = 20 y así sucesivamente

 app.get('/api/questions', (req, res, next) => { Question.find({},{},{limit:20,skip:0}, (err, questions) => { res.json(questions); }); });