如何在Sails/Waterline 1.0中以数据库无关方式获取列最大值?
解决Sails 1.0 ORM获取最大值/最小值的问题
嘿,我之前在使用Sails 1.0的Waterline ORM时也碰到过这个疑惑——明明有avg()和sum(),怎么好像找不到max()和min()?其实它们是存在的,而且完全支持数据库无关的实现,不用依赖原生SQL!
方法1:直接使用Waterline的聚合函数max()/min()
Waterline其实内置了max()和min()聚合方法,用法和avg()、sum()完全一致,只是可能文档里没特意强调。比如你要获取最大id,直接这么写:
// 推荐用async/await的异步写法 const maxId = await YourModel.max('id'); // 也支持传统回调写法 YourModel.max('id', (err, maxId) => { if (err) { /* 处理错误逻辑 */ } // 拿到maxId后做后续操作 });
这个方法会自动根据你配置的数据库(PostgreSQL、MySQL、MongoDB等)生成对应的原生聚合查询,完全不用自己写SQL,完美实现数据库无关。
方法2:通过排序+限制实现(兼容所有适配器)
如果某些特殊场景下max()方法不生效(比如极个别旧适配器),还可以用更通用的排序+取第一条的方式:
const latestRecord = await YourModel.find({}) .sort('id DESC') // 按id降序排列,最大的id会排在最前面 .limit(1); // 只获取第一条数据 const maxId = latestRecord.length ? latestRecord[0].id : null;
这种方式本质是查询出id最大的那条记录,再提取它的id值,同样是数据库无关的,所有Waterline支持的数据库都能正常工作。
为什么不推荐原生查询?
你提到已经用PostgreSQL原生查询实现了,但确实如你所想,原生查询会绑定特定数据库,后续如果切换到其他数据库(比如MySQL),就需要修改SQL语句,而上面两种ORM方法完全不用改动代码,维护性和通用性都更好。
内容的提问来源于stack exchange,提问作者paul23
相关产品推荐
相关产品推荐

