一、兩種路徑語法概覽
語法類型 | 觸發標志 | 簡介 |
---|---|---|
JSONPath | 以 $ 開頭 | 全功能路徑,支持遞歸 (.. )、通配符 (* )、切片 ([start:end:step] )、過濾 (?() )、腳本表達式等 |
Legacy | 以 . 或鍵名開頭 | 早期版本(v1)遺留語法,只支持簡單的點式和中括號,不支持通配符/過濾 |
RedisJSON 會根據第一個字符自動判斷:
- 以
$
開頭 → JSONPath - 否則 → Legacy
二、JSONPath 語法要點
語法 | 功能 | ||
---|---|---|---|
$ | 根節點 | ||
. 、[] | 直接子節點選擇 | ||
.. | 遞歸搜索,匹配任意層級的同名字段 | ||
* | 通配符,匹配當前節點下所有子元素 | ||
[i] | 數組下標,支持負數(-1 表示最后一個) | ||
[start:end:step] | 數組切片,如 [0:2] 、[:3] 、[::2] | ||
[?()] | 過濾表達式,支持比較運算符 ==,!=,<,<=,>,>=,=~ 以及邏輯運算 `&&, | ` | |
@ | 當前元素引用,在過濾器內用 @.field 訪問 | ||
() | 腳本表達式 |
提示:在 CLI 中,整個 JSONPath 通常要用單引號包裹,以免 Shell 把
$
、*
等展開。
三、Legacy 語法要點
- 以點號
.
或直接鍵名開頭(可省略根節點.
) - 支持
a.b.c
、a["key-with-special"]
、a[0]
、a[-1]
- 不支持通配符、遞歸、切片、過濾等高級特性
四、實戰示例
假設已在 Redis 中載入以下文檔(鍵名 bikes:inventory
,見你的示例):
# 省略 JSON.SET 代碼,假設文檔已存在
1. 基本查詢
# 獲取整個 inventory 下所有子數組(mountain_bikes、commuter_bikes)
JSON.GET bikes:inventory '$.inventory.*'
2. 提取所有山地車型號
JSON.GET bikes:inventory '$.inventory.mountain_bikes[*].model'
# 或
JSON.GET bikes:inventory '$..mountain_bikes[*].model'
# 返回 ["Phoebe","Quaoar","Weywot"]
3. 遞歸查詢
# 查找所有 model 字段
JSON.GET bikes:inventory '$..model'
# 返回 ["Phoebe","Quaoar","Weywot","Salacia","Mimas"]
4. 數組切片
# 前兩個山地車
JSON.GET bikes:inventory '$.inventory.mountain_bikes[0:2].model'
# 返回 ["Phoebe","Quaoar"]
5. 過濾表達式
# 價格 < 3000 且 重量 < 10 的山地車
JSON.GET bikes:inventory '$..mountain_bikes[?(@.price < 3000 && @.specs.weight < 10)]'
# 材料為 alloy 的所有車型型號
JSON.GET bikes:inventory '$..[?(@.specs.material == "alloy")].model'
# 返回 ["Weywot","Mimas"]
# 正則匹配材料以 "al-" 開頭(v2.4.2+ 支持 =~)
JSON.GET bikes:inventory '$..[?(@.specs.material =~ "(?i)al")].model'
# 返回 ["Quaoar","Weywot","Salacia","Mimas"]
6. 更新與增刪
# 所有價格統一減 100 / 加 100
JSON.NUMINCRBY bikes:inventory '$..price' -100
JSON.NUMINCRBY bikes:inventory '$..price' 100
# 對價格 <2000 的車型,設為 1500
JSON.SET bikes:inventory '$.inventory.*[?(@.price<2000)].price' 1500
# 向所有價格 <2000 的 colors 數組追加 "pink"
JSON.ARRAPPEND bikes:inventory '$.inventory.*[?(@.price<2000)].colors' '"pink"'
五、Legacy 語法示例
# 等同于 $.inventory.mountain_bikes[0].model
JSON.GET bikes:inventory .inventory.mountain_bikes[0].model
# 或
JSON.GET bikes:inventory inventory["mountain_bikes"][1].model
六、性能與注意事項
-
定位開銷:路徑深度越深、對象鍵越多、過濾條件越復雜,查詢時間越長;推薦預先
JSON.GET
小范圍字段或使用聚合后端做二次過濾。 -
過濾器正則:
=~
支持 PCRE 風格,默認部分匹配,需精確匹配請在模式前后加^
、$
。 -
路徑返回格式:
- 單路徑 → 頂層返回數組
- 多路徑 → 返回對象,每個路徑對應一個數組
-
CLI 轉義:Windows PowerShell 與 Bash 對引號處理不同,必要時可多層轉義或改用客戶端 SDK。
通過掌握上述示例與要點,你就能靈活使用 RedisJSON 強大的路徑查詢和更新能力,實現對嵌套 JSON 的高效操作。祝編程愉快!