Node.js环境下MongoDB与Sails框架中aggregate方法报错问题求助
解决Sails框架中MongoDB聚合方法报错的问题
嘿,我明白你遇到的问题了!你用Production.find({})能正常查询,但调用Production.aggregate([])时却报错说这个方法不存在,这是因为Sails默认的Waterline模型并没有直接封装MongoDB的aggregate()原生聚合方法——find()是Waterline支持的通用查询接口,但聚合属于MongoDB特有的操作,得换个方式调用。
解决方案:调用MongoDB原生驱动的集合对象
要使用聚合操作,你需要先获取模型对应的原生MongoDB集合,再调用它的aggregate()方法。下面是修改后的代码:
方式1:使用async/await(更现代的异步写法)
module.exports = { list : async function(req,res) { try { // 获取Production模型对应的原生MongoDB集合 // 注意:集合名通常是模型名的小写复数,比如Production对应production,根据你的实际集合名调整 const productionCollection = await Production.getDatastore().manager.collection('production'); // 执行聚合操作,通过toArray()获取结果 const collection = await productionCollection.aggregate([{ $project: { data: { $substr: ["$pt",0,10] }, prodTempo: { $substr: ["$sis",0,10]} } }]).toArray(); res.view('list',{producao:collection}); } catch(err) { res.send(500,{error:"DataBase Error"}); console.error(err); // 建议打印错误详情方便排查 } } };
方式2:使用回调函数(兼容旧写法)
如果你习惯用回调,也可以这样写:
module.exports = { list : function(req,res) { // 获取原生集合 Production.getDatastore().manager.collection('production') // 执行聚合 .aggregate([{ $project: { data: { $substr: ["$pt",0,10] }, prodTempo: { $substr: ["$sis",0,10]} } }]) // 转换为数组结果 .toArray(function(err,collection ){ if(err){ res.send(500,{error:"DataBase Error"}); console.error(err); return; } res.view('list',{producao:collection}); }); } };
关键注意点
- 集合名确认:
collection('production')里的名称要和你MongoDB中实际的集合名一致。Sails默认会把模型名转成小写复数(比如Production对应production),如果你的集合名是productions或者自定义的名字,一定要改成对应的。 - 原生驱动方法:MongoDB原生的
aggregate()返回的是游标对象,需要调用toArray()才能拿到最终的结果数组,这和Waterline的exec()用法不太一样。
这样调整后,你的聚合操作就能正常运行啦!
内容的提问来源于stack exchange,提问作者Lucas Breitembach
相关产品推荐
相关产品推荐

