knex:从结果创建数组的适当方法是啥?
Posted
技术标签:
【中文标题】knex:从结果创建数组的适当方法是啥?【英文标题】:knex: what is the appropriate way to create an array from results?knex:从结果创建数组的适当方法是什么? 【发布时间】:2016-09-12 08:10:51 【问题描述】:我有一个端点将user
和user_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
);
但是,这将为每个电子邮件地址返回一个新文档。我想要的是一组文档,如下所示:
[
id: 1,
name: 'Steve',
emails: [
address: 'hello@world.org' ,
address: 'meow@meow.org'
]
,
id: 2,
name: 'Jimmy',
emails: [
address: 'jimmy@jimbo.org'
]
]
这在knex中应该怎么做?
【问题讨论】:
如果我理解正确,你会为每个地址获得 1 行,但你希望它嵌套到“名称”? 嵌套到emails
作为数组但是是的
【参考方案1】:
假设您使用的是 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')
【讨论】:
绝对完美!谢谢!不过,如果你碰巧知道,这可以用来制作对象数组吗? 如果你说的是创建一个json对象数组,postgres 9.4及以上版本支持使用json_object(col 1, col 2)。 啊,这行得通,但也为json_build_object
提供了一个漂亮的链接
由于某种原因,我在数组中只得到一个值。这可能是什么原因?以上是关于knex:从结果创建数组的适当方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
将 MySQL 结果集转换为 NumPy 数组的最有效方法是啥?
Knex.js INNER JOIN 结果的 DISTINCT