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

在NodeJS中使用PostgreSQL JSON类型的最佳方法是什么,json,node.js,postgresql,Json,Node.js,Postgresql,我在这里面临一些分析瘫痪。使用NodeJS编程数据库的选项太多了,我有点不知所措 我正在使用Express构建一个API服务器,它将与手机上的HTML5应用程序进行对话。我决定使用PostgreSQL,因为我的数据是“非常相关的”,PostgreSQL新的JSON数据类型将使我的生活更加轻松 不幸的是,我找不到任何利用新JSON数据类型或公开它的PostgreSQL库。我考虑使用并拥有一个好的ORM,或者通过使用原始pgsql模块来滚动我自己的东西 有人能提供线索吗?我会在一些NodeJS st

我在这里面临一些分析瘫痪。使用NodeJS编程数据库的选项太多了,我有点不知所措

我正在使用Express构建一个API服务器,它将与手机上的HTML5应用程序进行对话。我决定使用PostgreSQL,因为我的数据是“非常相关的”,PostgreSQL新的JSON数据类型将使我的生活更加轻松

不幸的是,我找不到任何利用新JSON数据类型或公开它的PostgreSQL库。我考虑使用并拥有一个好的ORM,或者通过使用原始pgsql模块来滚动我自己的东西

有人能提供线索吗?我会在一些NodeJS stackexchange上问这个问题,但我认为我们没有这样具体的问题。

我喜欢。它是积极发展的,只是一个很好的薄层

要在准备好的查询中使用json类型,只需将您试图存储为json的内容字符串化即可(这正是postgres所希望的)。

使用pg扩展对我来说非常有用。

是将PostgreSQL与Node JS一起使用的最简单方法,Node JS通过承诺进行扩展,用于自动连接和事务。

对数据和数据都有很好的支持

您不必使用任何技巧来解析/字符串化json数据。这一切都是自动完成的。您可以声明模式以允许验证要放入数据库等的数据

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

编辑:

不知道为什么在这里投票(目前为-2),
objective.js仍然是节点世界中对Postgresql JSONB操作的最佳支持(也是当前答案中唯一的选择,它对Postgresql JSONB处理有任何特殊支持)

最新添加的功能是只支持修补JSONB列中的部分数据,Objective.js会自动为您构造
JSONB_set()
调用

例如:

ModelWithJsonColumn.query().update({
  'jsonColumn:attribute' : 'new value',
  otherColum: ref('jsonColumn:extractThisAttribute')
}).where('id', 1).returning('*')
将创建如下更新查询:

update "ModelWithJsonColumn" set 
    "jsonColumn" = jsonb_set("jsonColumn", '{attribute}', to_jsonb('new value'), true), 
    "otherColumn" = "jsonColumn"#>'{extractThisAttribute}'
where "id" = 1 returning *
也可以在几乎所有查询生成器方法(如中)中使用
ref()
语法

.select(['id', ref('jsonArrayColumn:[0]')])

甚至连连接都没有

.join('PetTable', 
      ref('PetTable.jsonColumn:details.name'), 
      '=', 
      ref('ThisTable.someOtherJsonbColumn:dogName'))

我也搜索了这个问题的答案,并在相关问题中找到了类似的解决方案

var pg = require("pg");
var Promise = require("bluebird");

Object.keys(pg).forEach(function(key) {
    var Class = pg[key];
    if (typeof Class === "function") {
        Promise.promisifyAll(Class.prototype);
        Promise.promisifyAll(Class);
    }
})
Promise.promisifyAll(pg);

这允许您将
pg
Promise
s一起使用。这里的详细信息

我使用sequelize,将JSON字符串化,然后解析出来。我喜欢这个设置。使用mongo和mongoose时更是如此。使用sequelize,您将无法查询jsonb列中包含某些数据的行,也无法仅修补jsonb列中的某些字段。长期以来不受支持且不可用。
var pg = require("pg");
var Promise = require("bluebird");

Object.keys(pg).forEach(function(key) {
    var Class = pg[key];
    if (typeof Class === "function") {
        Promise.promisifyAll(Class.prototype);
        Promise.promisifyAll(Class);
    }
})
Promise.promisifyAll(pg);