介绍
Dataview 是 Obsidian 的一个索引插件,可以对数据进行动态查询和展示,默认的 Dataview Query Language(DQL)语法类似 SQL,如果会 SQL 那么看完官方指南 Differences to SQL 这一章就能直接上手,不会也没事,语法很简单。同时 Dataview 还提供了 JavaScript API,如果会 JabaCrap 可以选择用 DataviewJS 实现一些更高级的功能。
本文主要就是列举几个我在入门阶段遇到的问题和对应的代码,对于 DQL 的语法就不介绍了,自己看文档和搜教程就能了解个大概,同时也不涉及 DataviewJS 的内容。
文档
- Dataview reference
- Dataview Codeblock Reference
- Metadata on Pages (e.g.
file.name
)
- Dataview 插件介绍
- luxon/iso format date
- Dataview: Replace number with emoji from array?
不足
Obsidian 其实自带 query language(就是搜索框用的那个),虽然比较废,但有的功能是 Dataview 办不到的。
举个🌰️,搜索带有 ## Wishlist
H2 heading 的笔记,Dataview 就搞不定:
- Accessing file headings as a variable in Dataview
- List all files with a specific heading
- Aggregating data from headers
而 Obsidian 自带的 query language 可以轻松做到:
section:(## Wishlist) -#journal
需要根据使用场景来判断选择 Obsidian query 还是 Dataview。
实例
下面都是我在使用 Obsidian 过程中自然而然产生的需求,应该比较贴合实际应用,大致按照难度升序。
排除文件夹
列出包含 #selfhost
标签的笔记,并排除日记文件夹:
list
from #selfhost and -"Journal"
sort file.name asc
排除文件名含指定关键词的笔记
列出包含 #llm
标签的笔记,并排除周记和 OKR:
list
from #llm and -#weekly
where !contains(file.name, "OKR")
sort file.name asc
标签打标后再次细分
小批量修改含 #ubisoft
标签的笔记,根据修改时间升序,实际应用是在「刺客信条」相关的笔记中添加 #assassin
的标签(即从宽泛的 #ubisoft
标签细化为 #assassin
、#rayman
等具体标签):
list
from #ubisoft
sort file.mtime asc
筛选旧笔记
列出在含 #journal
标签的笔记中,距离上次修改日期超过 90 天,且不是周记(即文件名不含例如 2023-W35
中的 W
)的笔记,根据修改时间升序,显示前 10 个结果:
list
from #journal
where file.mday + dur(90 days) < date(today) and !contains(file.name, "W")
sort file.mtime asc
limit 10
计算元数据
类似上面的例子,查找最久未修改的三篇笔记,主要是展示如何计算元数据并保留 2 位小数点:
table round(file.size/8/1024, 2) as "Size (KiB)", file.mday as "Lastmod"
where file.mday + dur(90 days) < date(today) and !contains(file.name, "W")
sort file.mtime asc
limit 3
在 WHERE
Query 中排除标签
接着上面的例子,展示如何在 WHERE
query 中排除带 #walkthrough
标签的笔记(FROM
很简单,只要 -#walkthrough
就行,但 WHERE
不那么显而易见)
list
where file.mday + dur(90 days) < date(today) and !contains(file.name, "W") and !contains(file.etags, "walkthrough")
sort file.mtime asc
limit 3
批量添加 Tag 时快速筛选
列出 Journal/2023
路径下,不含 #weekly
标签的周记(即文件名包括 W
),按修改时间升序,实际用途是批量添加某 tag 时快速筛选还没添加的周记:
list
from "Journal/2023" and -#weekly
where contains(file.name, "W")
sort file.mtime asc
时间计算
来自周记模板,根据本周几项健康指标制表,并加入星期几,排除周记,按照文件名(即日期)升序:
table without id
dateformat(default(dodate, file.day + dur(1 d)), "ccc") as "",
睡眠 as "😴", 心情 as "🥰", 饮食 as "🥩", 今天吃啥 as "食"
where contains(file.folder, this.file.folder) and file.day and !contains(file.name, "W")
SORT file.name ASC
Todo
想用 Dataview 制作一个本月运动时间统计,但不想用丑陋的 DataviewJS,至今没能实现。
思路:列出本月「运动的日子」中每天的运动时间,然后求和
日记模板对应的内容:
# 2023-09-14
💪🏻 运动::true
🔥 运动时间::19
目前完成的部分:
table without id
round(运动时间/60, 2) as "exercise"
where contains(file.name, "2023-09-") and 运动
sort 运动时间 desc