NodeJS的sequelize操作数据库(六)

780 阅读2分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

排序和分组

 order and group 参数,与 ORDER BY 和 GROUP BY 可以一起使用

order 参数用来让 sequelize 方法对查询进行排序. 这些列本身是 [column, direction] 形式的数组(如 ASCDESCNULLS FIRST 等)

Subtask.findAll({
  order: [
    // 将转义 title 并针对有效方向列表进行降序排列
    ['title', 'DESC'],

    // 将按最大年龄进行升序排序
    sequelize.fn('max', sequelize.col('age')),

    // 将按最大年龄进行降序排序
    [sequelize.fn('max', sequelize.col('age')), 'DESC'],

    // 将按 otherfunction(`col1`, 12, 'lalala') 进行降序排序
    [sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],

    // 将使用模型名称作为关联名称按关联模型的 createdAt 排序.
    [Task, 'createdAt', 'DESC'],

    // 将使用模型名称作为关联名称通过关联模型的 createdAt 排序.
    [Task, Project, 'createdAt', 'DESC'],

    // 将使用关联名称按关联模型的 createdAt 排序.
    ['Task', 'createdAt', 'DESC'],

    // 将使用关联的名称按嵌套的关联模型的 createdAt 排序.
    ['Task', 'Project', 'createdAt', 'DESC'],

    // 将使用关联对象按关联模型的 createdAt 排序. (首选方法)
    [Subtask.associations.Task, 'createdAt', 'DESC'],

    // 将使用关联对象按嵌套关联模型的 createdAt 排序. (首选方法)
    [Subtask.associations.Task, Task.associations.Project, 'createdAt', 'DESC'],

    // 将使用简单的关联对象按关联模型的 createdAt 排序.
    [{model: Task, as: 'Task'}, 'createdAt', 'DESC'],

    // 将由嵌套关联模型的 createdAt 简单关联对象排序.
    [{model: Task, as: 'Task'}, {model: Project, as: 'Project'}, 'createdAt', 'DESC']
  ],

  // 将按最大年龄降序排列
  order: sequelize.literal('max(age) DESC'),

  // 如果忽略方向,则默认升序,将按最大年龄升序排序
  order: sequelize.fn('max', sequelize.col('age')),

  // 如果省略方向,则默认升序, 将按年龄升序排列
  order: sequelize.col('age'),

  // 将根据方言随机排序(但不是 fn('RAND') 或 fn('RANDOM'))
  order: sequelize.random()
});

Foo.findOne({
  order: [
    // 将返回 `name`
    ['name'],
    // 将返回 `username` DESC
    ['username', 'DESC'],
    // 将返回 max(`age`)
    sequelize.fn('max', sequelize.col('age')),
    // 将返回 max(`age`) DESC
    [sequelize.fn('max', sequelize.col('age')), 'DESC'],
    // 将返回 otherfunction(`col1`, 12, 'lalala') DESC
    [sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
    // 将返回 otherfunction(awesomefunction(`col`)) DESC, 这种嵌套可能是无限的!
    [sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
  ]
});

order 数组的元素可以如下:

  • 一个字符串 (它将被自动引用)

  • 一个数组, 其第一个元素将被引用,第二个将被逐字追加

  • 一个具有 raw 字段的对象:

    • raw 内容将不加引用地逐字添加
    • 其他所有内容都将被忽略,如果未设置 raw,查询将失败
  • 调用 Sequelize.fn (这将在 SQL 中生成一个函数调用)

  • 调用 Sequelize.col (这将引用列名)

分组

分组和排序的语法相同,只是分组不接受排列顺序作为数组的最后一个参数(不存在 ASCDESCNULLS FIRST 等),将字符串直接传递给 group

User.findAll({ group: 'name' });
// 生成 'GROUP BY name'

限制和分页

limit 和 offset 参数可以进行 限制/分页,一般和 order 参数一起使用.

// 提取10个实例/行
User.findAll({ limit: 10 });

// 跳过8个实例/行
User.findAll({ offset: 8 });

// 跳过5个实例,然后获取5个实例
User.findAll({ offset: 5, limit: 5 });