使用$match与$lookup查询数据报错求助:需指定cursor选项
解决MongoDB聚合查询的"cursor"选项必填错误
嘿,刚看到你的问题,这个报错我之前踩过坑!本质是MongoDB Node.js驱动版本的变动导致的——从3.0版本开始,aggregate()方法默认不再直接返回数组,而是返回游标,除非你显式指定cursor选项或者用toArray()来转换结果,不然就会抛出这个错误。
给你两种修复方案,挑你顺手的来:
方案一:添加cursor选项并处理游标
直接在聚合参数后面加上{ cursor: {} },然后把返回的游标转成数组:
router.get('/jobs/:type', (req, res, next)=>{ Job.aggregate([ { $match : { category: req.params.type, "bidcounter": { $gt:-1, $lt:5} } }, { $lookup: { from: "job_cat", localField: "category", foreignField: "jobID", as: "product_cat" } }, { $sort : { date : -1} } ], { cursor: {} }, function(err, jobsCursor){ if (err) return next(err); // 别忘了处理错误! jobsCursor.toArray((err, jobs) => { if (err) return next(err); res.json(jobs); }); }); });
方案二:用async/await的Promise风格(更推荐)
这种写法更符合现代Node.js的异步处理方式,还能避免未处理的Promise拒绝警告:
router.get('/jobs/:type', async (req, res, next)=>{ try { const jobs = await Job.aggregate([ { $match : { category: req.params.type, "bidcounter": { $gt:-1, $lt:5} } }, { $lookup: { from: "job_cat", localField: "category", foreignField: "jobID", as: "product_cat" } }, { $sort : { date : -1} } ]).toArray(); res.json(jobs); } catch(err) { next(err); // 统一捕获错误交给中间件处理 } });
另外提一句:你原来的代码没有错误处理逻辑,这也是为什么会出现UnhandledPromiseRejectionWarning的原因之一——如果聚合过程出错,错误没有被捕获就会变成未处理的Promise拒绝。上面两种方案都加上了错误处理,能避免这个问题。
内容的提问来源于stack exchange,提问作者Dng
相关产品推荐
相关产品推荐

