使用NodeJS的PostgreSQL JSON类型的最佳方法是什么

And*_*zia 17 postgresql json node.js

我在这里面临一些分析瘫痪.使用NodeJS编程数据库有很多选择,我有点迷失.

我正在使用Express构建一个API服务器,它将与移动设备上的HTML5应用程序通信.我决定使用PostgreSQL,因为我的数据是"非常关系"的,而PostgreSQL新的JSON数据类型将使我的生活更轻松.

不幸的是,我找不到PostgreSQL的任何库利用新的JSON数据类型或暴露它.我想过使用Sequelize和一个很好的ORM或使用raw pgsql模块滚动我自己的东西.

有人能说清楚吗?我在一些NodeJS stackexchange上问过这个问题,但我认为我们没有具体的那个.

小智 9

我喜欢https://github.com/brianc/node-postgres.它是积极开发的,只是一个很好的薄层.

要在准备好的查询中使用json类型,只要JSON.stringify 你想要存储为json的任何东西(无论如何都是postgres想要的).


Mik*_*stö 5

Objection.js关系数据以及JSONB数据确实具有很好的支持。

您无需做任何技巧就可以解析/字符串化json数据。这一切都是自动完成的。您可以声明架构以允许验证要放入数据库等的数据。

可以将嵌套的关系对象层次结构插入数据库,并且将生成行以更正表,并且您具有JavaScript API来查询JSON列中的数据,因此也无需为此编写RAW SQL。

编辑:

不知道为什么这里的否决票(当前为-2)Objection.js仍然在节点世界中对Postgresql的JSONB操作具有最好的支持(也是当前答案的唯一选择,对PostgreSQL的jsonb处理有任何特殊的支持)。

最新添加的功能是仅修补JSONB列中的部分数据,其中objection.js会自动jsonb_set()为您构造调用。

例如:

ModelWithJsonColumn.query().update({
  'jsonColumn:attribute' : 'new value',
  otherColum: ref('jsonColumn:extractThisAttribute')
}).where('id', 1).returning('*')
Run Code Online (Sandbox Code Playgroud)

将创建如下更新查询:

update "ModelWithJsonColumn" set 
    "jsonColumn" = jsonb_set("jsonColumn", '{attribute}', to_jsonb('new value'), true), 
    "otherColumn" = "jsonColumn"#>'{extractThisAttribute}'
where "id" = 1 returning *
Run Code Online (Sandbox Code Playgroud)

同样ref(),几乎每个查询生成器方法都可以使用语法,例如

.select(['id', ref('jsonArrayColumn:[0]')])
Run Code Online (Sandbox Code Playgroud)

要么

.where('name', ref('jsonColumn:middleName')) 
Run Code Online (Sandbox Code Playgroud)

甚至连

.join('PetTable', 
      ref('PetTable.jsonColumn:details.name'), 
      '=', 
      ref('ThisTable.someOtherJsonbColumn:dogName'))
Run Code Online (Sandbox Code Playgroud)