节点续集组

时间:2017-10-18 22:56:03

标签: node.js postgresql sequelize.js

Postgresql数据库。表:

Name  | equalId

name1 | 1
name2 | 2
name3 | 1
name4 | 2
name5 | 1

我想得到一个按equalId排序的对象数组。例如:

[
{equalId: 1, names: ['name1', 'name3', 'name5']},
{equalId: 2, names: ['name2', 'name4']},
]

我如何用sequelize做到这一点?

我试过了:

    await db.name.findAll({
      where: {equalId: {$not: null}},
      attributes: [
        'equalId', 'name'
      ],
      order: ['name'],
      group: ['equalId', 'name'],
      raw: true,
      logging: true
    });

但结果不正确(

1 个答案:

答案 0 :(得分:2)

在从数据库中检索结果后,您需要对结果进行排序和分组。

db.name.findAll({
  where: {equalId: {$not: null}},
  attributes: ['equalId', 'name'],
  order: ['equalId'],
  raw: true,
  logging: true
})
.then((items) => {
  // get an object keyed by equalId with a value of an array of names
  const names = items.reduce((names, item) => {
    if (!names[item.equalId]) {
      names[item.equalId] = [item.name];
    } else {
      names[item.equalId].push(item.name);
    }
    return names;
  }, {});
  // get an array of results from the object
  const result = Object.keys(names).map((equalId) => {
    return {
      equalId: equalId,
      names: names[key],
    };
  })
  // resolve the result array
  return Promise.resolve(result);
});