如何查询 JSONB,初学 sheet cheat

如何查询 JSONB,初学 sheet cheat

原文:https://medium.com/hackernoon/how-to-query-jsonb-beginner-sheet-cheat-4da3aa5082a3

假设我们必须在 PostgreSQL 9.5+数据库上查询一个带有metadata JSONB 列的user表。

1.按第一级属性的值选择项目(#1 路)

您可以使用metadata上的@>操作符进行查询。该操作符可以将部分 JSON 字符串与 JSONB 列进行比较。是围堵操作员。对于这种情况,您可能需要在metadata列中添加一个杜松子酒索引。

SELECT * FROM users WHERE metadata @> '{"country": "Peru"}'; 

2.按第一级属性的值选择项目(#2 路)

->>操作符以文本形式获取一个 JSON 对象字段。如果您想要查询 JSONB 列中的简单字段,请使用它。您可以在metadata->>'country'上添加一个 B 树索引。

SELECT * FROM users WHERE metadata->>'country' = 'Peru';

3.选择项目属性值

再次,->>操作符以文本形式获取一个 JSON 对象字段。直接在SELECT里用就行了。

SELECT metadata->>'country' FROM users;

4.仅选择具有特定属性的项目

您可以将->>操作符与您在文本上使用的经典操作符一起使用:=<>IS NULL等。不要忘记用 B 树索引来索引metadata->>'country'

SELECT * FROM users WHERE metadata->>'country' IS NOT NULL;

5.按嵌套属性的值选择项目

您可以同时使用@>->>,就像第一级属性一样。根据自己的选择添加一个索引。

SELECT * FROM users WHERE metadata->'company'->>'name' = "Mozilla";SELECT * 
  FROM users 
  WHERE metadata @> '{"company":{"name": "Mozilla"}}';

6.通过数组中的属性值选择项目

记住@>操作符检查 JSONB 列中的包含,您可以通过将{"x":["a"]}传递给WHERE子句来查询类似于{"x": ["a", "b", "c"]"}的数组:

SELECT * FROM users WHERE metadata @> '{"companies": ["Mozilla"]}';

7.属性上的 IN 运算符

有时,我们可能需要选择 JSONB 列中的属性与一组可能的值匹配的项目。

SELECT * FROM users 
  WHERE metadata->>'countries' IN ('Chad', 'Japan');

8.插入整个对象

照常使用UPDATE ... SET,将整个对象作为 JSON 传递。

UPDATE users SET metadata = '{"country": "India"}';

9.更新或插入属性

使用||操作符将实际数据与新数据连接起来。它将更新或插入值。

UPDATE users SET metadata = metadata || '{"country": "Egypt"}';

10.移除属性

操作员-从对象上取下钥匙。

UPDATE users SET metadata = metadata - 'country';

最后一个音符

对 JSONB 对象的查询几乎和经典的 SQL 查询一样简单。我在这里只贴了几个例子,关于对我来说最常见的用例。这是给我的一个提示,我希望它也能帮助其他人。

您可以阅读 PostgreSQL 文档,其中有更多的示例和更精确的解释:

[## PostgreSQL:文档:9.6: JSON 函数和操作符

注意:对于 json 和 jsonb 类型,这些操作符有并行的变体。字段/元素/路径…

www.postgresql.org](https://www.postgresql.org/docs/9.6/static/functions-json.html) [## PostgreSQL:文档:9.6: JSON 类型

PostgreSQL 只允许每个数据库使用一种字符集编码。因此,JSON 类型不可能…

www.postgresql.org](https://www.postgresql.org/docs/9.6/static/datatype-json.html)

请随时提出建议、反馈和批评。我很乐意了解更多。

感谢艾米莉·施耐德(再次)的点评。


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除