Obsidian Dataview 入门实例

介绍

Dataview 是 Obsidian 的一个索引插件,可以对数据进行动态查询和展示,默认的 Dataview Query Language(DQL)语法类似 SQL,如果会 SQL 那么看完官方指南 Differences to SQL 这一章就能直接上手,不会也没事,语法很简单。同时 Dataview 还提供了 JavaScript API,如果会 JabaCrap 可以选择用 DataviewJS 实现一些更高级的功能。

本文主要就是列举几个我在入门阶段遇到的问题和对应的代码,对于 DQL 的语法就不介绍了,自己看文档和搜教程就能了解个大概,同时也不涉及 DataviewJS 的内容。

文档

不足

Obsidian 其实自带 query language(就是搜索框用的那个),虽然比较废,但有的功能是 Dataview 办不到的。

举个🌰️,搜索带有 ## Wishlist H2 heading 的笔记,Dataview 就搞不定:

而 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

Vinfall's Geekademy

Sine īrā et studiō