在sails / waterline中,以数据库无关的方式获取列的最大值

时间:2018-02-06 20:49:07

标签: javascript orm sails.js waterline

使用sails作为ORM(版本1.0)时,我注意到有一个名为Model.avg的函数(以及sum)。 - 但是,没有最大或最小函数来从模型中的列获得最大值或最小值;所以这似乎没有必要,因为它已经被其他功能覆盖了?

现在在我的数据库中,我需要获得"最大ID"列表中;我使用本机查询使用 for postgresql

const maxnum = await Order.getDatastore().sendNativeQuery('SELECT MAX(\"orderNr\") FROM \"order\"')

虽然这不是最困难的事情,但这并不是我真正想要的:它仅限于基于sql的数据存储(因此我们无法轻易地移动到mongodb);对于另一个sql数据库类型,语法实际上可能会有所不同。

所以我想知道 - 这可以通过它不依赖于sendNativeQuery的方式进行转换吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试.query()使用指定模型的数据存储区执行原始SQL查询,如果您希望您可以尝试pg,这是一个用于与PostgreSQL数据库通信的NPM包:

Pet.query('SELECT pet.name FROM pet WHERE pet.name = $1', [ 'dog' ] 
  ,function(err, rawResult) {
    if (err) { return res.serverError(err); }

    sails.log(rawResult);
    // (result format depends on the SQL query that was passed in, and 
       the adapter you're using)

    // Then parse the raw result and do whatever you like with it.

   return res.ok();
});

答案 1 :(得分:0)

您可以使用水线提供的limitorder选项来获取具有最大值的单个模型(然后只提取该值)。

const orderModel = await Order.find({
    where: {},
    select: ['orderNr'],
    limit: 1,
    sort: 'orderNr DESC'
});
console.log(orderModel.orderNr);

与Waterline中的大多数内容一样,它可能不如SQL SELECT MAX查询(或mongo中的某些等效查询)有效,但它应该允许交换数据库而无需维护。最后请注意,不要忘记处理没有找到模型的情况。