Dataview 驾驶舱:三块面板管住 2400 条笔记
用三个 Dataview 查询做成每日驾驶舱:今天该做什么、最近改过什么、项目卡在哪。附可直接复制的查询与性能设置。
Dataview 的价值不是「把所有笔记列出来」,而是回答三个每天都会问自己的问题。我把它们放在一个叫「今日」的笔记里,打开 Obsidian 第一眼就看这一页。
面板一:今天该做什么
跨全库收集未完成任务,按项目和截止日排序:
TASK
FROM "10 Areas" OR "20 Projects"
WHERE !completed
GROUP BY file.link
SORT rows.text ASC如果任务太多,加一层过滤,只看本周:
TASK
FROM "20 Projects"
WHERE !completed AND (due <= date(today) + dur(7 days) OR !due)
SORT due ASC注意 due 是任务行里的行内字段,写成 - [ ] 写完调色板 📅 2026-10-30,Tasks 插件或 Dataview 都能识别。
面板二:最近改过什么
我几乎不按日期找笔记,但需要知道「这周我到底动了什么」:
TABLE WITHOUT ID
file.link AS "笔记",
dateformat(file.mtime, "MM-dd HH:mm") AS "最后修改",
level AS "难度"
FROM "10 Areas" OR "20 Projects" OR "30 Resources"
WHERE file.mtime >= date(today) - dur(7 days)
SORT file.mtime DESC
LIMIT 20WITHOUT ID 很重要:默认的 File 列是重复信息,去掉之后表格宽度刚好放得下。
面板三:项目卡在哪
每个 Project 笔记的 frontmatter 里有一个 stage 字段,取值只有三个:进行中、卡住、待启动。面板只显示卡住的:
TABLE WITHOUT ID
file.link AS "项目",
stage AS "阶段",
blocker AS "卡点",
dateformat(file.mtime, "yyyy-MM-dd") AS "上次动作"
FROM "20 Projects"
WHERE stage = "卡住"
SORT file.mtime ASC按「上次动作」升序排,最久没动的排最上面。这一列比任何优先级字段都诚实。
一个 dataviewjs 小用例
需要按标签统计数量时,DQL 不太好写,用 JS 更直接:
const pages = dv.pages('"30 Resources"');
const counts = {};
for (const p of pages) {
for (const t of (p.tags ?? [])) {
const key = t.toString().replace('#', '');
counts[key] = (counts[key] ?? 0) + 1;
}
}
const rows = Object.entries(counts).sort((a, b) => b[1] - a[1]).slice(0, 12);
dv.table(["标签", "笔记数"], rows);它只做一件事:告诉你哪些标签已经膨胀。超过 30 条的标签,通常该升级成 MOC 了。
性能:三条设置
2400 条笔记时,Dataview 默认配置会明显拖慢启动。我做了三件事:
- 在设置里关掉
Enable JavaScript Queries的全局刷新,只在需要的页面开dataviewjs。 - 所有查询都写
FROM限定目录,绝不写FROM #tag全库扫描。 - 移动端关闭 Dataview 的自动刷新,只在桌面端用驾驶舱。
如果某一页打开要超过 2 秒,先怀疑 WHERE 里用了 contains(file.content, ...)——那会读全文。换成标签或 frontmatter 字段。
别做成仪表盘地狱
我最初做了 11 个面板,结果是每天打开先看 11 个面板,然后什么也没做。现在只有 3 个,每个都对应一个具体动作:清任务、看最近、解卡点。面板数量应该等于你每天真正会做的决定数量,不是你能想到的统计维度数量。