這是「Obsidian 入門」第 3 篇。還沒用過 Obsidian,先看第 1 篇;用 Web Clipper 存網頁的方法在第 2 篇。
文中的查詢都在我的筆記庫實際跑過(Obsidian 1.15.0、Dataview 0.5.68),結果照實貼上。狀態是 2026-11-05 的情形。
先講結論
- Dataview 是什麼:Obsidian 的社群外掛,免費。在筆記裡寫一小段查詢,它會照每篇筆記開頭的屬性,列出清單或表格。筆記改了,清單自己跟著變,不用手動維護。
- 查詢只有幾個部分:要列成什麼樣子(
LIST清單、TABLE表格、TASK待辦)、從哪裡找(FROM)、留下哪些(WHERE)、怎麼排、取幾筆(SORT、LIMIT)。 - 先有屬性,才有東西可查:日期、地點、狀態這些資料寫在屬性裡,Dataview 才查得到。
- 最常踩的坑:資料夾名稱沒加引號、日期顯示成英文、分組以後欄位變成「-」。後面一個一個講。
- Obsidian 現在也有內建的 Bases,不用寫查詢就能做表格。我自己一直用 Dataview,Bases 還沒用過,最後一節簡單比較。
安裝
Dataview 是社群做的外掛,第一次裝要先打開社群外掛的功能:
- 打開「設定」,左邊點「第三方外掛程式」。
- 第一次用,先把最上面的「受限模式」關掉。關掉才能裝社群做的外掛。
- 在「社群外掛程式」那一列按「瀏覽」,搜尋 Dataview。
- 按「安裝」,裝好再按「啟用」。
手機版也能裝,我的 iPhone 有裝。手機上沒裝的話,看到的會是查詢本身,不是結果。
先有屬性
屬性是寫在筆記最上面、用 --- 包起來的那幾行資料。我的每篇遊記開頭長這樣(這是三層坪那篇,只列出這篇文章會用到的幾行):
---
title: "三層坪"
tags: [旅遊, 遊記, 攝影, 宜蘭, 落羽松]
日期: "2023-02-10"
地點: "宜蘭 三層坪"
分類: 旅行
網站: 發布
---
幾件事先知道:
- 屬性名稱用中文沒問題,查詢裡直接寫
日期、地點就好。 - 寫成
2023-02-10這種格式,Dataview 會自動當成日期,可以比大小、算天數。加不加引號都一樣。 - 標籤寫在屬性的
tags裡,跟在內文寫#瀑布效果一樣。
除了你自己寫的屬性,Dataview 還會自動幫每篇筆記記一些資料,例如檔名、所在資料夾、最後修改時間、有哪些筆記連到它。後面「Dataview 自己就知道的資料」一節會列出來。
第一個查詢:列出清單
在任何一篇筆記裡,打下這一段(三個反引號加 dataview,結尾也是三個反引號):
```dataview
LIST
FROM "20-Projects/個人網站/遊記"
```
切到閱讀模式或即時預覽(Cmd+E),就會看到那個資料夾裡的六篇遊記:
- 三層坪遊記
- 九寨溝與黃龍遊記
- 大湖六塘落羽松遊記
- 泰安瀑布遊記
- 烏來內洞遊記
- 象山夜景遊記
每一行都是連結,點了就打開那篇。FROM 後面的資料夾路徑要換成你自己的,從筆記庫最外層開始寫,一定要加雙引號。
做成表格
把 LIST 換成 TABLE,後面寫要哪些欄位,再加 SORT 排序:
```dataview
TABLE 日期, 地點
FROM "20-Projects/個人網站/遊記"
SORT 日期 DESC
```
DESC 是由新到舊,ASC(或不寫)是由舊到新。結果:
| File | 日期 | 地點 |
|---|---|---|
| 九寨溝與黃龍遊記 | February 01, 2025 | 四川 九寨溝、黃龍 |
| 三層坪遊記 | February 10, 2023 | 宜蘭 三層坪 |
| 大湖六塘落羽松遊記 | December 10, 2021 | 新竹 北埔 大湖六塘 |
| 烏來內洞遊記 | July 29, 2021 | 新北 烏來 內洞國家森林遊樂區 |
| 泰安瀑布遊記 | July 24, 2021 | 基隆 七堵 泰安瀑布 |
| 象山夜景遊記 | July 16, 2021 | 台北 信義區 象山 |
第一欄固定是檔名(File)。日期變成英文,而且九寨溝那篇我只寫了「2025-02」,卻顯示成 2 月 1 日,這兩件事在後面「踩過的坑」講怎麼處理。
欄位想換個標題,用 AS:TABLE 日期 AS "出發日", 地點 AS "去了哪"。不想要第一欄的檔名,寫 TABLE WITHOUT ID。
只留符合條件的:WHERE
用標籤找:FROM 後面也可以寫標籤,標籤不用加引號。
```dataview
LIST
FROM #瀑布
```
結果是泰安瀑布、烏來內洞兩篇。
用屬性篩:WHERE 寫條件,只留符合的。例如只看 2021 年去的:
```dataview
TABLE 地點
FROM "20-Projects/個人網站/遊記"
WHERE 日期.year = 2021
SORT 日期
```
結果是象山、泰安瀑布、烏來內洞、大湖六塘四篇,照日期由舊到新排。日期後面加 .year 取年、.month 取月。
其他常用的寫法,都在我的遊記上試過:
| 想找什麼 | 怎麼寫 | 我的結果 |
|---|---|---|
| 屬性等於某個字 | WHERE 網站 = "發布" |
六篇都是 |
| 屬性裡有某幾個字 | WHERE contains(地點, "新北") |
烏來內洞 |
| 一段日期之間 | WHERE 日期 >= date(2021-07-01) AND 日期 < date(2021-08-01) |
象山、泰安瀑布、烏來內洞 |
| 有填這個屬性的 | WHERE 地點 |
六篇都有填 |
條件可以用 AND(而且)、OR(或)接起來;不等於寫 !=。
分組:GROUP BY
想看「每年去了幾趟、去了哪」,用 GROUP BY:
```dataview
TABLE WITHOUT ID key AS "年", length(rows) AS "幾篇", rows.file.link AS "遊記"
FROM "20-Projects/個人網站/遊記"
GROUP BY 日期.year
SORT key DESC
```
| 年 | 幾篇 | 遊記 |
|---|---|---|
| 2025 | 1 | 九寨溝與黃龍遊記 |
| 2023 | 1 | 三層坪遊記 |
| 2021 | 4 | 大湖六塘落羽松遊記、泰安瀑布遊記、烏來內洞遊記、象山夜景遊記 |
分組以後,每一列變成「一組」而不是「一篇」:key 是這組的值(這裡是年份),rows 是這組裡的每一篇,length(rows) 是幾篇。這裡寫錯很常見,後面坑的第 3 條講。
Dataview 自己就知道的資料
這些不用自己寫,每篇筆記都有,名稱都是 file. 開頭:
| 寫法 | 是什麼 |
|---|---|
file.name |
檔名 |
file.folder |
在哪個資料夾 |
file.link |
連到這篇的連結 |
file.mtime、file.mday |
最後修改的時間、日期 |
file.ctime、file.cday |
檔案建立的時間、日期 |
file.tags |
這篇的所有標籤 |
file.inlinks |
有哪些筆記連到這篇 |
file.outlinks |
這篇連到哪些筆記 |
file.tasks |
這篇裡的待辦事項 |
拿來做幾個常用的清單:
最近改過的 10 篇(不寫資料夾,就是整個筆記庫):
```dataview
TABLE file.mtime AS "最後修改"
SORT file.mtime DESC
LIMIT 10
```
沒有被任何筆記連到的孤兒頁(整理筆記時很好用,找出被遺忘的那些):
```dataview
LIST
FROM "10-Notes"
WHERE length(file.inlinks) = 0
```
我拿遊記資料夾試,結果是空的,因為六篇都有被別的筆記連到,被連最多的九寨溝那篇有 5 個。
90 天沒動過的筆記:
```dataview
LIST
FROM "10-Notes"
WHERE file.mtime < date(today) - dur(90 days)
```
date(today) 是今天,dur(90 days) 是 90 天,兩個可以相減。
另外,屬性不一定要寫在最上面。在內文裡寫 心情:: 很好(兩個冒號),Dataview 一樣查得到,叫行內欄位。我習慣都寫在最上面的屬性裡,打開筆記一眼就看得到。
把待辦集中起來:TASK
散在各篇筆記裡的待辦(- [ ] 要做的事),可以用 TASK 集中看:
```dataview
TASK
FROM "10-Notes"
WHERE !completed
```
!completed 是「還沒打勾的」。列出來的待辦可以直接打勾,打勾會改回原本那篇筆記。
我實際在用的:一頁總覽
我的筆記庫有一頁總覽,放了 14 段查詢:總共幾頁、今天新增和更新了幾頁、還是草稿的有幾頁、孤兒頁、90 天沒更新的、最近 7 天新增的、被連最多的前 10 頁。打開看一眼,就知道筆記庫哪裡該整理。
其中一段長這樣,列出 90 天沒更新、最舊的 20 頁:
```dataview
TABLE WITHOUT ID file.link AS "頁面", status, updated AS "最後更新"
FROM "wiki/entities"
WHERE date(today) - date(updated) > dur(90 days)
SORT updated ASC
LIMIT 20
```
這裡用的是我自己寫的 updated 屬性,不是 file.mtime,原因在坑的第 6 條。
還有一段是用 JavaScript 寫的(Dataview 也接受 ```dataviewjs 區塊),算出草稿比例、孤兒頁數,再依數字亮綠、黃、紅燈。剛開始用不到,知道有這個可能就好。我的筆記庫用了哪些外掛,寫在 PKM 第 4 講。
如果你用了第 2 篇的 Web Clipper 範本,剪下來的網頁都有 pending_action 屬性,可以用一段查詢列出收件匣裡還沒處理的:
```dataview
TABLE pending_action AS "下一步"
FROM "00-Inbox"
WHERE pending_action
SORT file.ctime DESC
```
踩過的坑
1. 資料夾名稱沒加引號
FROM 20-Projects/個人網站/遊記 少了引號,會整段出不來,只看到一段錯誤:
-- PARSING FAILED --------------------------------------------------
> 1 | LIST FROM 20-Projects/個人網站/遊記
| ^
資料夾要加雙引號,標籤不用:FROM "20-Projects/個人網站/遊記"、FROM #瀑布。
2. 日期顯示成英文
Dataview 預設把日期顯示成「February 10, 2023」。兩種改法:
- 全部改:設定 → Dataview →「Date Format」,改成
yyyy-MM-dd。 - 只改這段查詢:用
dateformat,例如TABLE dateformat(日期, "yyyy-MM-dd") AS "日期",結果就是 2023-02-10。
另外,日期只寫到月份(2025-02)也會被當成日期,但會變成那個月的 1 號。排序和篩選年、月都沒問題,只是顯示時會多出一個「01」。
3. 分組以後,欄位變成「-」
分組以後,欄位如果照樣寫 日期.year,整欄都會是「-」。因為一列已經是一組,不是一篇:分組的值要用 key,原本每篇的屬性要從 rows 裡拿,例如 rows.file.link。照上面「分組」那節的寫法就對了。
4. 寫死日期的「今天」,隔天就錯
查「今天新增的」,要寫 date(today),不要寫成 date(2026-11-04)。我自己的總覽頁就有兩段把日期寫死了,到了隔天,「今日新建」其實是在算前一天的。
5. 不寫 FROM,會查整個筆記庫
LIST 後面不寫 FROM,就是查全部筆記。官方文件提醒,筆記很多時會跑很久,嚴重時 Obsidian 會卡住。平常盡量加上 FROM,把範圍縮小到某個資料夾或標籤。
6. 結果只存在 Obsidian 裡
筆記裡存的是查詢本身,不是結果。所以:
- 原始碼模式看到的是那段查詢,切到閱讀模式或即時預覽才會出現結果。
- 把筆記內容複製貼到別的地方、用其他 App 打開、或手機沒裝 Dataview,看到的都是那段查詢。
file.ctime是檔案系統記錄的建立時間,檔案被複製、在雲端同步時被重建,時間就可能變掉。我的筆記庫放在 iCloud,所以重要的日期(建立、更新)都自己寫成屬性,查詢時用屬性,不用file.ctime。
Dataview 還是 Bases?
Obsidian 現在有內建的 Bases(核心外掛),也能把筆記依屬性排成表格。官方說明裡寫的差別,加上我自己的使用情況:
| Dataview | Bases | |
|---|---|---|
| 誰做的 | 社群外掛 | Obsidian 官方,內建 |
| 怎麼做 | 寫查詢 | 在畫面上選欄位、篩選、排序 |
| 能不能直接改 | 只能看;要改屬性得打開那篇 | 可以在表格裡直接改屬性 |
| 版面 | 清單、表格、待辦、月曆 | 表格、清單、卡片等 |
| 我用了多久 | 筆記庫建起來就在用,總覽頁 14 段 | 還沒用過 |
我的建議:剛開始、只想把一個資料夾排成表格,可以先試 Bases,不用學語法。要集中待辦、找孤兒頁、算天數、做總覽頁,Dataview 比較順手,網路上的範例也多。兩個可以同時開,我的筆記庫兩個都開著。
參考資料
- Dataview 官方說明文件(英文):Structure of a Query、Metadata on Pages、Data Types
- Obsidian 官方說明(英文):Introduction to Bases、Properties
官方文件為 2026-11-05 查閱,功能以官網為準。