【问题标题】:knex: what is the appropriate way to create an array from results?knex:从结果创建数组的适当方法是什么?
【发布时间】:2016-09-12 08:10:51
【问题描述】:

我有一个端点将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
});

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

[{
  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 作为数组但是是的

标签: javascript node.js postgresql knex.js


【解决方案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 提供了一个漂亮的链接
  • 由于某种原因,我在数组中只得到一个值。这可能是什么原因?
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多