← Obsidian 入門

Dataview 入門:讓筆記自己列出清單(用我的六篇遊記當例子)

發布 2026-11-05・約 6 分鐘讀完

這是「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 怎麼運作:每篇筆記開頭的屬性(例如三層坪的日期與地點、泰安瀑布的日期與標籤)交給一段查詢,依序是 TABLE 要列哪些欄位、FROM 從哪個資料夾或標籤找、WHERE 只留符合條件的、SORT 與 LIMIT 怎麼排取幾筆,最後變成表格或清單,筆記一改就跟著變

安裝

Dataview 是社群做的外掛,第一次裝要先打開社群外掛的功能:

  1. 打開「設定」,左邊點「第三方外掛程式」。
  2. 第一次用,先把最上面的「受限模式」關掉。關掉才能裝社群做的外掛。
  3. 在「社群外掛程式」那一列按「瀏覽」,搜尋 Dataview。
  4. 按「安裝」,裝好再按「啟用」。

手機版也能裝,我的 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 比較順手,網路上的範例也多。兩個可以同時開,我的筆記庫兩個都開著。

參考資料

官方文件為 2026-11-05 查閱,功能以官網為準。