我的Obsidian中有許多功能都是透過dataview來完成的,但似乎很少看見比較新的dataview教學。

什麼是Dataview?

Dataview是一個Obsidian的第三方外掛程式,由Michael Brenan開發。可以將你的Obsidian Vault當作一個資料庫,從中提取你指定的資料,並用表格、清單等方式呈現。

Dataview有什麼用?

由於Dataview可以提取並排序指定的資料,所以可以做到很多事情,例如說:

  1. 以清單顯示與工作有關的所有筆記。
  2. 以表格顯示看過的讀書筆記,以讀完的日期排序,並且列出這些書的作者以及出版社。
  3. 顯示出七日內即將到期的任務。
  4. 顯示出被標註「重要」的任務。
  5. 以清單顯示出所有含有「知識」關鍵字的頁面。

只要熟悉Dataview一個第三方外掛程式,這些都可以做到。

Dataview 使用方式

Dataview的基礎寫法是在你想要顯示資料之處寫下:

‵‵‵dataview
A
where B
from C
sort D
‵‵‵

A:可以選擇list、table、task、calendar B:目標資料的條件,例如「含有特定文字」。 C:提取範圍,例如「含有特定tag或來自特定資料夾」。 D:排序方式 由list、table、calendar列出的資料會是「檔案」,也就是副檔名.md的markdown檔案,而task則會列出有check box的任務。其他還有flattengroup by以及各種「函式」,算是比較進階的用法,等到實際使用案例再來詳述,底下先講個大概:

資料來源

在Dataview的搜尋之中,除了可以找內文、修改時間、建立時間、特定Tag之類的基本搜尋之外,有個很棒的特點,就是可以自己建立Metadata。

Metadata

什麼是Metadata?Metadata似乎沒有一個通用的中文翻譯,有人稱之為「元資料」或是「後設資料」,其意義即是「描述資料的資料」,舉例來說:一則網路新聞是一串「資料」,而這個新聞的「發布時間」、「作者」則是這則新聞特有的屬性,也就是「用來描述這個資料的資料」,這就是「後設資料」,就是Metadata。

那麼,Dataview可以查詢Metadata為什麼很棒呢?這到底有什麼用?讓我們再舉個簡單的例子:利用Obsidian作會議記錄,每一則會議筆記中都設定有「相關專案」的Metadata欄位,之後便可以用Dataview把所有的會議記錄都顯示出來,並在後面欄位顯示出「每一個會議中提到哪些相關專案」。同理,我們可以列出所有的讀書筆記,列出每一本書的作者。甚至配合Tag與Daily Note,我可以記錄我在哪天去加油,再利用Dataview自動幫我計算汽車的油耗。

資料呈現的方式

List

將符合條件的頁面用清單的方式呈現。例如:以清單方式呈現含有#project的頁面。這可能是我最少用的顯示方式,用Table還能自訂要顯示的欄位內容,太方便了。

‵‵‵dataview
list
from #project 
‵‵‵

Table

將符合條件的頁面用清單的方式呈現,可以自訂欄位以及排序方式,例如可以指定「不顯示檔名」、「顯示檔案最後修改日期」等等。例如說:

‵‵‵dataview
table without ID
	file.mtime as "前次修改時間",
	NextStep as "下一步"

from #project 

‵‵‵

在Table的下一行,即是定義不同欄位,以逗號區隔,可以新增更多欄位。

Task

任務與前兩項有點不同,List與Table顯示的都是「檔案」,而Task顯示的則是「任務」,而且也可以使用Metadata。

‵‵‵dataview
task
where contains(text, "bike") and !completed
from "Daily"

‵‵‵

在Task的使用中需要注意的一點是,Task是單行的資料,而不是檔案,所以如果要對其使用Metadata,需要在Task的同一行上加上[ ]並用::來定義,比如說到期日是2022-08-20,就會表示為[due :: 2022-08-20],之後就可以在Dataview中找到這個Task了。

Calendar

Calendar則是我最少用到的,它會把符合條件的檔案以月曆的方式顯示。

‵‵‵dataview
calendar file.mtime
from #project 
‵‵‵

實際使用案例

GTD dashboard

GTD會把任務編入各種不同的清單,例如「等待清單」,即是「做完自己的部份,等待他人回應的任務」、也有「也許清單」,就是「也許有一天我想做的事情」的清單,因此我們就可以在Daily Note或是獨立的GTD Dashboard頁面中用Dataview顯示出含有特定Tag的任務。

但真正的GTD精神中,這個系統不過是輔助,能夠劃掉眼前的任務,或是把心上的任務寫下,解除心理限制,這才是GTD的重點。

等待清單:

‵‵‵dataview
task
where contains(text, "#waiting") and !completed

‵‵‵

上面的!completed即是代表「未完成的任務」。

也許清單:

‵‵‵dataview
task
where contains(text, "#maybe") and !completed
‵‵‵

同理我們可以設立任何清單,並且在任何地方新增任務,並用Dataview在你要的地方顯示出來,不再限於傳統的GTD一定要把所有的東西丟進Inbox。

Bullet Journal

子彈筆記的精神也有受到上述的GTD影響,但更進一步,子彈筆記中,所有的任務都會被處理到,如果來不及處理,可以用圖示表示這個任務被「延後」或是「取消」,這樣便可以一目了然所有任務的處理狀況。接著還有Future Log與Monthly Log等的頁面,可以同步看懂未來要做什麼,下個月要做什麼。在傳統的子彈筆記中,必須用手重複把任務騰去他所屬的月份、禮拜等等,我們則可以透過Dataview與tag來讓這件事情自動化。

假設我們需要「顯示2022年中預計要做的任務」的Future Log,我會這樣寫:

‵‵‵dataview
task
where contains(text,"#moveto2022")
where !completed
‵‵‵

也就是說,只要在任務後用Tag標上日期(#moveto日期)便可以利用Dataview追蹤顯示任何任務,甚至在每天的Daily Note中自動顯示當日的任務。

接下來?

我自己發現可以利用Tag來實現子彈筆記時,感覺相當不錯,成就感十足,也讓我的系統更趨近完善。但事實上,我上面寫的這些,以及先前提過的(例如利用Dataview做到Habit Tracker)都只是Dataview的一半功能而已,Dataview可以支援使用Javascript,只要把Code中的dataview改成dataviewjs便可開始使用,可惜的是我自己對這一塊還沒有研究完全,以後會再花時間搞懂它。


有任何問題或建議?歡迎聯絡我: ch.lien@proton.me