You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CockroachDB v2.0-beta如何查询JSONB嵌套属性子集?

在CockroachDB v2.0-beta中查询JSON嵌套属性的方法

当然可以查询JSON blob的嵌套属性啦!CockroachDB v2.0-beta提供了多种JSON操作符,完全支持处理嵌套的JSON结构,我结合你的表结构给你几个实用的场景示例:

1. 用@>操作符匹配嵌套的JSON子集

你已经在使用@>来匹配顶层的properties属性,这个操作符其实支持递归匹配更深的嵌套结构。比如如果你的acct列中有类似这样的JSON:

{
  "id": "user123",
  "properties": {
    "foo": "bar",
    "details": {
      "age": 30,
      "city": "New York"
    }
  }
}

想要筛选出properties.details.city等于New York的记录,直接把嵌套结构写进@>的匹配条件里就行:

SELECT acct->>'id' 
FROM account 
WHERE acct @> '{"properties": {"details": {"city": "New York"}}}'

这个查询会自动利用你创建的account_acct_idx倒排索引,效率很高。

2. 用->/->>直接访问嵌套属性

如果需要直接针对某个嵌套属性做筛选,或者提取嵌套属性的值,可以用这两个操作符:

  • ->:返回JSON类型的属性值
  • ->>:返回文本类型的属性值

比如筛选properties.details.age大于25的记录:

SELECT acct->>'id' 
FROM account 
WHERE (acct->'properties'->'details'->>'age')::INT > 25

再比如直接提取嵌套的city属性:

SELECT 
  acct->>'id' AS user_id,
  acct->'properties'->'details'->>'city' AS user_city
FROM account

3. 关于索引的小提示

你已经给acct列建了倒排索引,使用@>操作符时会自动用上这个索引。但如果是用->/->>直接筛选嵌套属性,默认可能不会触发倒排索引。如果这类查询很频繁,可以考虑给嵌套属性建一个表达式索引,比如:

CREATE INDEX idx_acct_details_city ON account ((acct->'properties'->'details'->>'city'));

这样针对city的筛选查询就能利用这个索引提升速度了。

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:14