knex:从结果创建数组的合适方法是什么?
knex: what is the appropriate way to create an array from results?
我有一个端点连接 user
和 user_emails
table 作为一对多关系 (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
});
但是,这将为每个电子邮件地址 return 一个新文档。我想要的是一组文档,如下所示:
[{
id: 1,
name: 'Steve',
emails: [
{ address: 'hello@world.org' },
{ address: 'meow@meow.org' }
]
}, {
id: 2,
name: 'Jimmy',
emails: [
{ address: 'jimmy@jimbo.org' }
]
}]
这应该如何在 knex 中完成?
假设您使用的是 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')
我有一个端点连接 user
和 user_emails
table 作为一对多关系 (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
});
但是,这将为每个电子邮件地址 return 一个新文档。我想要的是一组文档,如下所示:
[{
id: 1,
name: 'Steve',
emails: [
{ address: 'hello@world.org' },
{ address: 'meow@meow.org' }
]
}, {
id: 2,
name: 'Jimmy',
emails: [
{ address: 'jimmy@jimbo.org' }
]
}]
这应该如何在 knex 中完成?
假设您使用的是 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')