Obtuve todos los datos con éxito en mi código node.js usando Profile.find() , pero cuando quiero agregar un filtro en la API, aparece el error 500.
Perfil.js
const mongoose = require('mongoose'); const Schema = mongoose.Schema; //Create Schema const ProfileSchema = new Schema({ type: { type: String, }, description: { type: String, }, cash:{ type: String, required: true, } }) module.exports = Profile = mongoose.model("profile",ProfileSchema);api.js
const router = express.Router(); const Profile = require('../../models/Profile'); router.get("/",passport.authenticate('jwt',{session:false}),(req, res) => { Profile.find().then(profiles => { res.json(profiles) })//works }) router.get("/",passport.authenticate('jwt',{session:false}),(req, res) => { var condition = {'cash' : '5000'}; Profile.find(condition,function(err,res){//error for this res.json(res) }) })Soy nuevo en mongoose y no estoy seguro de cómo hacer el filtro y la paginación de mi código. Agradezco cualquier tipo de ayuda.
Actualizar
Gracias a @Amila Senadheera, finalmente encontré la solución para filtrar y paginar usando el siguiente código:
var condition = { cash: '5000' }; Profile.find(condition).skip(1).limit(10).then(profiles => { res.json(profiles) })Para usar la agregación, funciona como se muestra a continuación:
router.post( "/", passport.authenticate("jwt", { session: false }), async (req, res) => { // page index let pageIndex = 1; // profiles per page let pageSize = 10; if (req.body.pageIndex !== null || req.body.pageIndex !== "undefined") { pageIndex = req.body.pageIndex; } if (req.body.pageSize !== null || req.body.pageSize !== "undefined") { pageSize = req.body.pageSize; } let condition = { description: "1" }; try { const getAllProfile = await Profile.aggregate([{ $facet: { data:[ { $match: condition }, { $skip: (pageIndex - 1) * pageSize }, { $limit: pageSize }, ], totalCount:[ { $match: condition }, { $count: 'totalCount' } ] } }]) ; res.json(getAllProfile); } catch (error) { res.status(404).json(error); } } );La función de búsqueda solo puede aceptar query y projection como argumentos. No se le permite dar una devolución de llamada como argumento. then debe estar encadenado a la Promise devuelta por find .
Prueba así
var condition = {'cash' : '5000'}; Profile.find(condition).then(profiles => { res.json(profiles) }); puede usar el marco de agregación de MongoDB para eso (lo que permitirá obtener información adicional como las entradas totales y el recuento de las entradas en la página actual (la última página puede tener un número menor que el límite de páginas)). Debe enviar start y limit como el cuerpo de la solicitud.
router.get( "/", passport.authenticate("jwt", { session: false }), async (req, res) => { // page index let start = 0; // profiles per page let limit = 10; if (req.body.start !== null || req.body.start !== "undefined") { start = req.body.start; } if (req.body.limit !== null || req.body.limit !== "undefined") { limit = req.body.limit; } let condition = { cash: "5000" }; try { const aggregatedData = await Profile.aggregate([ { $facet: { data: [ { $match: condition }, { $project: { type: 1, description: 1, cash: 1 } }, { $skip: start * limit }, { $limit: limit } ], metaData: [ { $group: { _id: null, count: { $sum: 1 } } } ] } } ]); return res.status(200).json({ data: aggregatedData[0].data, metaData: { total: aggregatedData[0].metaData[0].count, start: start } }); } catch (error) { return res.status(500).json({ error: error }); } } );