查詢
使用 ToriiDB 掃描指令搜尋 key、比較 stored value,並篩選 JSON 文件。
查詢指令
| 指令 | 範圍 | 結果排序 |
|---|---|---|
KEYS |
頂層 key name | 字典順序 |
FIND |
完整 raw entry value | 最新 entry 優先 |
QUERY |
JSON 文件內的 field | 最新 entry 優先 |
所有掃描指令都會略過已過期 entry 與保留的 __torii:* internal key。
KEYS
KEYS <pattern>
KEYS 對每個頂層 key 套用 Go path.Match:
KEYS *
KEYS user:*
KEYS cache:?
無效 pattern 不會匹配。結果依字典順序排序。這裡不解讀點記法,pattern 會與完整頂層 key 比對。
FIND
FIND <op> <value> [LIMIT <n>]
FIND 比較每個 entry 的完整 raw value:
FIND eq active
FIND gt 100 LIMIT 20
FIND like *database* LIMIT 10
支援運算子如下:
| 名稱 | 意義 |
|---|---|
EQ, = |
字串完全相等 |
NE, != |
字串不相等 |
GT, > |
數值大於 |
GTE, GE, >= |
數值大於等於 |
LT, < |
數值小於 |
LTE, LE, <= |
數值小於等於 |
LIKE |
文字 pattern matching |
數值運算子只有在 stored value 與 target value 都能解析為 floating-point number 時才可能匹配。
LIKE Pattern
LIKE 對開頭與結尾的 * 有特殊處理:
| Pattern | 匹配行為 |
|---|---|
prefix* |
Stored value 以 prefix 開頭 |
*suffix |
Stored value 以 suffix 結尾 |
*part* |
Stored value 包含 part |
part |
Stored value 包含 part |
* |
匹配所有 value |
這是文字 matcher,不是 regular-expression engine。
QUERY
QUERY <expression> [LIMIT <n>]
QUERY 對 parsed JSON document 計算 condition。Field name 可使用點記法:
QUERY active = true
QUERY profile.level >= 3
QUERY role = admin AND active = true LIMIT 20
QUERY ( role = admin OR role = editor ) AND NOT disabled = true
非 JSON entry,或 parsed cache 不可用的 entry,會被略過。缺少 field 時不符合 condition。
表達式文法
Expression parser 支援:
expression := or
or := and (OR and)*
and := not (AND not)*
not := NOT not | primary
primary := "(" expression ")" | field operator value
Operator name 不分大小寫。AND 優先於 OR,NOT 會遞迴套用到下一個 expression。
輸入以空白 tokenization。Parser 會剝除開頭 ( 與結尾 ),因此括號可貼在相鄰 token;但 value 本身無法把未引用的空白視為單一 operand。
程式化 Filter
filter package 提供可組合 filter:
f := filter.And{
filter.GTE{Field: "profile.level", Value: "3"},
filter.EQ{Field: "active", Value: "true"},
}
keys := db.Query(f, 20)
可用 condition type 包含 EQ、NE、GT、GTE、GE、LT、LTE、LE 與 LIKE。filter.AtoFilter 可解析與 QUERY 指令相同的 infix grammar。
限制與排序
FIND 與 QUERY 優先使用 UpdatedAt,否則使用 CreatedAt,將最新 match 排在前面;timestamp 相同時以 display text 決定順序。尾端正數 LIMIT n 會在排序後截斷;省略或無效 limit 代表沒有明確限制。
大型掃描會把 key 以 1024 個一組分塊處理,合併結果後再排序。