10

我有一个 Rails 应用程序,它聚合了来自 Google API 的大量数据。我目前将 JSON 响应存储在 MongoDB 中(所以我的 Rails 应用程序同时具有 pg 和 mongo)。然而,今天,我遇到了 PostgreSQL Hstore 扩展,我决定试一试。

不幸的是,我遇到了一个问题。API 给出的 JSON 是多层次的,因此 Ruby Hash afterJSON.parse包含哈希,其中包含新的哈希。但是,Hstore是字符串键/值存储,它只有 1 级深。所以第一个散列中的散列就变成了字符串。

我发现真正讨厌的 hack 是eval把哈希变成字符串:

eval("{ "foo" => "bar" }")

我不喜欢这个。关于做什么的任何提示?我应该继续使用 MongoDB 还是有更好的方法在 PG 中存储多级深度哈希?

4

7 回答 7

6

You should try using JSON extension for Postgresql. It will do exactly what you want: validate and store JSON. Originally JSON extension was added in 9.2. Postgres 9.3 added more features for JSON extension including new operators and functions. And postgres 9.4 will have advanced indexing support for JSON so you'll be futureproof with this setup.

Related links: http://www.postgresql.org/docs/9.3/static/functions-json.html http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3#JSON:_Additional_functionality

于 2013-10-31T17:13:23.143 回答
6

Nested Hstore是一个 gem,它支持 hstore 中的嵌套哈希(以及数组和其他类型),实现类似于 MongoDB 等文档存储的功能。它使用 hstore 和 JSON 序列化的混合。不过,它还没有在 Rails 4 上测试过。

于 2013-11-17T19:22:34.970 回答
4

作为 Hstore 状态的文档,Hstore 中的键和值只是文本字符串。Hstore 不能存储多级 json 对象,也不是为此目的。

所以为了简单起见,你不能通过简单地使用 Hstore 来将 MongoDb 替换为 PostgreSQL。相反,您需要像在任何其他关系数据库中一样为每种对象创建表。如果您的对象架构非常动态,最好继续使用 MongoDB。

于 2013-09-18T00:27:31.357 回答
4

作为该问题的后续,似乎 Postgresql 9.4 提供了一些很棒的好东西:

  1. Hstore 现在是嵌套的并支持数组,这意味着从简单的键值模型转向丰富的基于文档的模型。
  2. Hstore 对指定字段的访问速度很快(感谢二进制表示)
  3. Hstore 运营商可以使用 GiST 和 GIN 索引
  4. Json 用户可以使用功能性 GIN 索引并获得可观的加速
  5. json可以使用hstore的二进制表示

资源

于 2014-07-31T04:26:33.593 回答
2

使用 json 数据类型来存储 json,而不是 hstore。

于 2013-11-26T23:20:50.540 回答
1

如果您对将多级 json 转换为可以存储在 postgres 中的对象不感兴趣,则可以将所有内容粘贴到textpostgres 中的字段中,如果您正在寻找多级密钥/序列化/反序列化 json 字符串/ mongo 之外的值存储。

如前所述,Hstore 不会做你想做的事。

于 2013-09-18T00:40:37.217 回答
1
setting[:quizzes] # => "{:score=>true, :percent=>true, :weight=>true}"
JSON.parse setting[:quizzes].gsub(/:(\w+)/){"\"#{$1}\""}.gsub('=>', ':')
# => {"score"=>true, "percent"=>true, "weight"=>true}
于 2017-09-04T08:17:12.170 回答