Dataview:把仓库变成可查询数据库
Dataview 是 Obsidian 社区插件史上影响力最大的项目:它把你的笔记属性当成数据库字段,用类 SQL 的查询语言生成动态索引——书单、任务看板、文献综述都能「自动长出来」,源笔记更新结果实时变化。本章讲安装配置、DQL 查询语法和一批拿来即用的示例。注意 Dataview 是社区插件,具体行为以其官方文档为准。
安装与认知准备
社区插件市场搜 Dataview 安装并启用即可。它由社区开发者维护,不属于官方核心组件,版本更新节奏和行为细节以插件自身文档为准。理解它与原生功能的边界很重要:
- 内置搜索 + query 嵌入:零依赖、语法简单,适合轻量场景,上一章已讲。
- Bases 数据库视图:官方出品、可视化操作、可看板可卡片,适合「盯清单」。
- Dataview:编程级灵活性,能做计算、聚合、跨字段加工,适合「出报表」。
三者不冲突。经验法则:能用 Bases 解决的不上 Dataview,需要列表运算和复杂条件时才请出 Dataview。
DQL 快速入门
Dataview 的查询语言叫 DQL,三种基本查询形态:
```dataview
TABLE status, rating
FROM #读书
SORT rating DESC
```
四个核心子句的分工:
| 子句 | 作用 | 示例 |
|---|---|---|
FROM |
圈定数据源 | FROM #读书、FROM "20-项目"、FROM [[某笔记]] |
WHERE |
按条件过滤 | WHERE status = "在读" |
TABLE |
输出表格 | TABLE author, rating |
LIST |
输出列表 | LIST WHERE status = "在读" |
TASK |
输出任务 | TASK FROM "10-日记" |
SORT排序,FLATTEN/GROUP BY做展开与分组,LIMIT限条数。- 数据源三选一:标签(
#读书)、文件夹("路径")、入链([[笔记]]),可用AND/OR组合。 - 内联字段:正文里写
(key:: value)也能被查询到,适合不想写 YAML 的场景。
实用查询示例集
以下示例直接可用,把标签和属性名换成你自己的即可。
例一:读书进度看板。 所有读书笔记按评分倒序,显示状态、评分、作者:
```dataview
TABLE status AS 状态, rating AS 评分, author AS 作者
FROM #读书
SORT rating DESC
```
例二: overdue 的项目。 截止日期早于今天且未完成的项目:
```dataview
TABLE deadline, status
FROM #项目
WHERE deadline < date(today) AND status != "已完成"
SORT deadline ASC
```
例三:收集全库未完成任务。 从日记和会议纪要里捞所有未勾选任务:
```dataview
TASK
FROM "10-日记" OR #会议
WHERE !completed
```
例四:最近编辑的十篇笔记。 任何时刻都是最新的工作台首页:
```dataview
TABLE file.mtime AS 最后编辑
WHERE file.folder != "附件" AND !contains(file.path, "模板")
SORT file.mtime DESC
LIMIT 10
```
例五:无链接孤儿笔记。 找出没有任何出链的笔记,治理知识网络:
```dataview
LIST
WHERE length(file.outlinks) = 0 AND length(file.inlinks) = 0
```
这五个例子覆盖了 Dataview 八成日常用法。日期比较、字段访问、内联表达式等更细的语法,请以 Dataview 官方文档为准。
进阶提示:dataviewjs 与元数据卫生
Dataview 还提供 JavaScript API(dataviewjs 代码块),能做 DQL 做不到的复杂逻辑,比如按周聚合任务数、生成自定义 HTML。但本书建议:能用 DQL 就别写 JS——DQL 可读性好,未来自己都看得懂;JS 查询三个月后往往变成只有作者能维护的黑盒。
另一个高频踩坑点是元数据不卫生:同一字段有人写 status: 在读 有人写 status: Reading,查询结果立刻七零八落。对策有二:所有会参与查询的属性,取值范围先用属性视图统一检查;用 Bases 的表格视图做一次全库属性人工巡检,把不一致值改齐,再上 Dataview。
性能与替代
Dataview 在每次仓库变更后会重新计算查询,笔记过万且查询很多时会有可感知的延迟。缓解手段:一个页面只放必要查询;FROM 尽量收窄数据源;给查询块套 callout 折叠(> [!quote]-)减少渲染压力。如果你的需求只是「按标签筛出表格、拖动卡片换状态」,官方 Bases 性能更好,也不存在第三方维护风险。
Dataview 的正确打开方式是「从真实需求出发抄示例」:先明确你想自动看到什么(书单?逾期任务?孤儿笔记?),再从上面五个例子中找最接近的改一改。查询是手段,让你愿意持续记录的数据结构才是根基——这也是下一章模板系统的主题。
字段设计规范:查询质量的源头
Dataview 查询的质量上限,由你的属性字段设计决定。给一套让查询永远不踩坑的字段规范:
规范一:取值用固定词表。 status 字段的值从固定清单里选(在读/已读/想读),不自由发挥。中文值完全可以,只要全库一致。判断一个字段是否规范的方法:在属性视图里点开它,看值的分布是否收敛——出现七八种写法就是失控信号。
规范二:类型用对。 日期用日期类型而不是文本,数字用数字类型——类型正确,比较运算(<、>)和排序才有意义。Bases 的类型系统与 Dataview 读到的是同一份数据,一处规范处处受益。
规范三:命名全小写无空格。 readDate 或 read_date 都行,Read Date 不行——含空格的字段名在查询里需要特殊语法,能省则省。
规范四:一个字段一个含义。 不要让 tags 兼职做状态、让 title 兼职做分类。字段含义一旦混用,查询就永远写不清楚。
把这份规范贴在模板库里,每次想新增字段时过一遍。字段纪律 dull 但有效——它是「自动报表」与「一堆错误数据」之间的全部差别。
调试查询的实用技巧
查询结果不对时的排查路径,按命中率排序:第一查 FROM——数据源圈对了吗?把 FROM 换成空(全库)跑一遍,确认目标笔记在不在结果里,快速定位是「圈选错了」还是「过滤错了」。第二查 WHERE——字段名拼对了吗?值的大小写、全半角一致吗?Dataview 的字符串比较是精确匹配,在读 和 在读(带尾空格)是两个值。第三查类型——日期字段被存成文本,比较运算就会静默失效,去源笔记核对属性类型。第四用简化法——把复杂查询拆成两步跑,中间结果贴出来看,定位在哪一步开始偏离预期。
另外善用社区资源:Dataview 的官方文档有完整的函数参考,其讨论区里「如何统计 XX」类问题大多有人问过——抄改现有答案比自己发明快得多。记住 Dataview 的学习曲线是一次性的:前两周查文档抄示例,之后它的查询语法就会像双链一样成为肌肉记忆。
与 Bases 的分工再确认
Dataview 章的最后,把官方 Bases 与它的分工再钉一次:Bases 强在「看与管」——表格看板交互、直接编辑属性、官方维护零风险;Dataview 强在「算与报」——聚合统计、跨字段运算、任意嵌入位置。项目清单、读书进度这类「日常盯着」的视图交给 Bases;月度报表、孤儿笔记清单、「逾期任务数」这类「定期产出」的数字交给 Dataview。两件工具一件都不必须,但都值得会——你会在不同阶段偏爱不同的那一个。
二十分钟跑通第一个查询
照这条路线走,二十分钟内你将拥有第一个能用的 Dataview 报表。第 1-3 分钟:社区插件市场安装 Dataview 并启用。第 4-10 分钟:准备数据——给五篇左右笔记补上统一的属性(以读书为例:status、rating、author,值从本章的词表规范里取),属性不齐的先补齐,数据是查询的粮食。第 11-16 分钟:新建笔记《我的书架》,贴入本章例一的 TABLE 查询,把 #读书 换成你实际用的标签,切阅读视图看结果——五篇笔记应该以表格形式出现。第 17-20 分钟:改造查询练手——把 SORT 改成按 rating 升序看最差的书;加一行 WHERE rating >= 4 只看好书;再把整个查询块前后各加一行三个反引号外的 Callout 折叠(> [!example]- 我的书架 包裹),让书架页默认收起。三个小改动做完,你已经掌握了 DQL 的日常用法闭环:改数据源、改排序、加过滤、控制呈现。
之后的成长路径只有一条:遇到真实的统计需求,回来抄本章示例集改一改。第二十个查询写完时,DQL 就不再是「学的语法」,而是「用的工具」——这也是所有查询语言唯一靠谱的学习方式。
延伸阅读:DQL 的条件表达式与正则结合更强,正则表达式从入门到精通 建议搭配食用;查询语言的学习方法论,与 Claude Code 完全指南 中「从示例入手学语法」的路径完全一致。
本章由 WorkBuddy 原创整理,功能行为依据 Obsidian 官方帮助文档。
