knex:从结果创建数组的适当方法是什么?

cor*_*vid 5 javascript postgresql node.js knex.js

我有一个端点,它将useruser_emails表连接成一对多的关系(postgresql).它看起来如下.

router.get('/', function (req, res, next) {
  db.select('users.id', 'users.name', 'user_emails.address')
    .from('users')
    .leftJoin('user_emails', 'users.id', 'user_emails.user_id')
    .then(users => res.status(200).json(users))
    .catch(next)  // go to error handler
});
Run Code Online (Sandbox Code Playgroud)

但是,这将为每个电子邮件地址返回一个新文档.我想要的是一系列文档,如下所示:

[{
  id: 1,
  name: 'Steve',
  emails: [
    { address: 'hello@world.org' },
    { address: 'meow@meow.org' }
  ]
}, {
  id: 2,
  name: 'Jimmy',
  emails: [
    { address: 'jimmy@jimbo.org' }
  ]
}]
Run Code Online (Sandbox Code Playgroud)

如何在knex中完成?

Kan*_*naj 10

假设你正在使用Postgres - 你需要使用array_agg函数来生成数组.我建议使用knex.raw

如果有效,请告诉我.

   knex('users')
    .innerJoin('user_emails','users.id','user_emails.user_id')
    .select([
      'users.id as userID',
      'users.name as userName',
      knex.raw('ARRAY_AGG(user_emails.adress) as email')
    ])
    .groupBy('users.id','users.name')
Run Code Online (Sandbox Code Playgroud)

  • 啊,那行得通,但也为`json_build_object` 提供了一个漂亮的链接 (3认同)
  • 由于某种原因,我在数组中只得到一个值。原因可能是什么? (2认同)