這是 Obsidian 使用教學 — 插件篇的第 2 篇文章。
在 上一篇文章 中,我介紹了 Note Refactor 插件,可以快速幫我們拆分筆記。你可以在下方的文章複習內容:
這篇文章想介紹另一款 Obsidian 中的神器 — Dataview,一款類似 SQL 語法 (資料庫的結構化查詢語言, Structured Query Language) 的查詢語言。
Dataview 可以快速查詢特定條件的筆記,並且用 table (表格), list (清單), task (待辦事項) 呈現這些筆記條目。
參考 Dataview 插件文件 ,目前 Dataview 提供 2 種查詢方式:預設語法 和 Dataview Javascript 語法。由於後者需要一定的技術知識,因此本篇只會介紹前者。
查詢結果範例如下:
備註:若想要了解 Dataview Javascript 的應用,可參考 這篇文章
(1) 自行建立
Dataview 能夠查詢的欄位是由我們自己建立的,因此在使用 Dataview 之前,我們必須在每一則筆記中建立需要的資料欄位,以利未來查詢。
目前建立欄位的方法有 2 種:
▶︎ 在 YAML 區加入欄位
YAML 是一種描述設定的文字格式,通常使用人性化的語言來撰寫,以便讓閱讀者可以直接明白它要表達的意思。
在 Obsidian 中,我們可以用上下 ---
包住一段文字,這段文字就稱為 YAML。而在 YAML 區中,我們會用 <欄位名稱> : <值> 來格式來定義欄位的值。
例如下方的 YAML 區域包含了 date 和 aliases (筆記別名)。
如果 YAML 文字寫得正確,在切換成 Preview Mode 時就會看到 Metadata 的文字。
如果寫的不正確,就會出現 INVALID YAML 的文字。
在 YAML 區域定義的欄位都可以在後續被 Dataview 當作欄位搜尋到。想要了解更 YAML 格式如何寫,可以參考 Obsidian 的官方文件。
▶︎ 使用 inline field 加入欄位
另外一種在筆記中建立欄位的方式,稱為 inline field。它是由 Dataview 開發者自行定義的格式,必須寫在 YAML 區塊 (即 ---
外面),並且用 <欄位名稱> <值> 的格式。
inline filed 相較於 YAML,在欄位值的定義上更有彈性。因為在 YAML 區中,合法欄位值是不能包含 [[]]
的 (雖然你硬要寫 obsidian 也不會報錯,但在程式世界中這樣定義 YAML 欄位是不正確的觀念)。
我建議如果要建立的筆記欄位值需要寫 [[]]
,一律使用 inline field 的格式較好。範例如下圖:
你可能會好奇說:「那我到底需要建立哪些欄位呢?」
這個答案完全依據你個人需求而定,如果你參考我的 Metadata 格式,基本上會有以下欄位:
[[主題筆記]]
格式在剛使用 Obsidian 初期,你不需要一次增加這麼多欄位,可以依照自己的筆記需求慢慢增加就好。
(2) Dataview 內建欄位
除了自行建立欄位,Dataview 也提供許多內建的欄位可以使用。參考 官方文件 如下,由於解釋已經蠻淺白的我就不翻譯了:
file.name
: The file title (a string).file.folder
: The path of the folder this file belongs to.file.path
: The full file path (a string).file.link
: A link to the file (a link).file.size
: The size (in bytes) of the file (a number).file.ctime
: The date that the file was created (a date + time).file.cday
: The date that the file was created (just a date).file.mtime
: The date that the file was last modified (a date + time).file.mday
: The date that the file was last modified (just a date).file.tags
: An array of all tags in the note. Subtags are broken down by each level, so #Tag/1/A
will be stored in the array as [#Tag, #Tag/1, #Tag/1/A]
.file.etags
: An array of all explicit tags in the note; unlike file.tags
, does not include subtags.file.inlinks
: An array of all incoming links to this file.file.outlinks
: An array of all outgoing links from this file.file.aliases
: An array of all aliases for the note.file.day
: An explicit date associated with the file這裡的 file 指的是筆記檔案 (.md) 的意思。
Dataview 的基本查詢格式如下:
[TABLE|LIST|TASK] field1, field2, ..., fieldN FROM #tag or "folder" or [[link]]
WHERE somefield = somevalue
COMMAND argument
用 ```dataview 當作開頭,最後用 ``` 將指令包住。
這樣看可能太複雜了,我們換另一種比較好理解的格式:
輸出格式(Table/List/Task) 欄位名稱
from [ #tag 或 資料夾 或 [[筆記]] ]
where 條件
sort 欄位 [排序]
下面我們逐行拆解說明。
▶︎ 決定呈現樣式 — Table, List, Task
Dataview 支援 3 種形式呈現查詢結果:
其中 Table 和 List 是我最常使用的,Task 幾乎沒有用到。
下方是範例。請留意表格、清單、待辦事項的呈現都是依據內建的主題樣式 CSS 決定。
▶︎ 要查詢哪裡
決定了樣式之後,接下來我們要告訴 Dataview 資料來源是什麼。目前 Dataview 支援 3 種形式的資料來源:
例如指定 [[product strategy MOC]],抓出連結到 product strategy MOC 的筆記。
▶︎ 加入篩選條件
Where 的意思代表篩選資料,也就是將資料源的資料依據特定條件呈現。
我常用的篩選條件有:
1. 24 小時內修改的筆記
where file.mtime \>= date(today) - dur(1 day)
2. 筆記檔案名稱不包含特定文字 (如果要包含把 ! 拿掉即可)
where !contains(file.name,"不包含的文字")
如果要看更多範例,可以看 官方文件的這一頁。
▶︎ 決定如何排序資料
最後我們可依據個人需求調整查詢結果的排列順序,使用的是 sort 這個關鍵字。
你可以依據日期 (date)、檔案修改時間 (file.mtime)、檔案建立時間 (file.ctime)…來做排序。如果要正序就用 asc 這個關鍵字,倒序就用 desc 這個關鍵字。
例如依據檔案建立日期倒序排列 (即最新到最舊),可以寫成
sort file.ctime desc
我在《如何透過寫筆記幫助自己深度思考 ? 使用 HQ&A 筆記法,結合「費曼學習法」與「間隔重複」幫自己學得更好》介紹了 HQ&A 的筆記格式,其中 Question 和 Answer 非常適合當作寫作靈感的提示。
例如今天我的寫作主題是「產品策略」,我可以搜尋「product strategy MOC (即產品策略主題)」筆記,利用 Dataview 將所有連結到此主題的 HQ&A Note 用表格呈現出來。
▶︎ 欄位設計
我在每一則筆記中,都有加入 Question
和 Answer
兩個欄位。
▶︎ Dataview 語法
table question, answerfrom [[product strategy MOC]]
where !contains(file.name,"daily note")
sort status desc, file.mtime desc
▶︎ 呈現結果
在每一天傍晚,我會用 Dataview 查詢今天有對哪些筆記做修改,當作今日個人筆記的復盤。
▶︎ Dataview 語法
list from ""WHERE file.ctime >= date(today) - dur(1 day)
▶︎呈現結果
我在 Obsidian 中會別針對「名詞」做筆記,紀錄我對每一個新名詞的理解,並且用 Dataview 彙整所有使用到此名詞 (有連結) 的筆記。
例如 PARA 分類系統 筆記中,目前有 2 篇筆記都有使用 PARA 這個名詞。這個用法特別適合拿來整理某則筆記的參考文獻。
▶︎ Dataview 語法
table parent-link as "父連結", file.mtime as "更新時間", file.ctime as "建立時間", status as "筆記狀態", file.inlinks as "相關連結"
from [[PARA system]]
sort status desc, file.mtime desc
▶︎ 呈現結果
閱讀完一本書籍後,我會利用 Note Refactor 這款插件將書籍中的筆記全部拆分出去,並且透過 Dataview 將這本書籍的相關筆記自動彙整。
這個案例的 Dataview 語法跟「自動化彙整名詞的相關文章」其實是一樣的,只是是用在書籍筆記中。例如下方是《讀懂一本書》的筆記整理。
▶︎ Dataview 語法
table parent-link as "父連結", file.mtime as "更新時間", file.ctime as "建立時間", status as "筆記狀態", file.inlinks as "相關連結"
from [[{讀懂一本書]]
where !contains(file.name, "MOC")
sort status desc, file.mtime desc
▶︎ 呈現結果
Dataview 相對於其他 Obsidian 插件是比較難上手的,在踩過無數雷坑後我有以下 3 點建議。
如果你要像我一樣使用 Emoji 當作 Tag,請注意不要使用 Obsidian Community Plugin — Emoji Toolbar 來插入。
使用 Emoji Toolbar 插入的 Emoji 是無法被 Dataview 讀取的,這點要特別注意。
目前網路上關於 Dataview 的學習資源還沒有很多,加上每個人筆記欄位設計的格式都不相同,可能你遭遇的問題是別人從來沒碰過的,因此未必都能獲得解答。
此時官方文件會是你最好的幫手,雖然文件的詳細程度還有待加強…但搜尋一遍官方文件後幾乎都可以想得的查詢語法。
如果不幸地你還是無法自己排除問題,以下有 2 個管道可以碰碰運氣 (不保證有人回應):
當你學會 Dataview 的基本操作後,可以嘗試和 Template 搭配一起使用。
例如實戰案例中的「自動化彙整筆記」功能,都可以用以下模板快速插入。因為我們的需求都是找到「連結到目前這則筆記」的其他筆記,因此可以用 [[{title}]] 當作變數快速插入筆記中。
table parent-link as "父連結", file.mtime as "更新時間", file.ctime as "建立時間", status as "筆記狀態"
from [[{{title}}]]
sort status desc, file.mtime desc
這篇文章介紹了 Obsidian 神器 — Dataview 的使用方式,包含:
希望大家閱讀完畢後都可以試用看看這款插件。若有不清楚的地方,歡迎在下方留言與我討論。