Dataview 驾驶舱:三块面板管住 2400 条笔记

用三个 Dataview 查询做成每日驾驶舱:今天该做什么、最近改过什么、项目卡在哪。附可直接复制的查询与性能设置。

ObsidianDataview自动化

Dataview 的价值不是「把所有笔记列出来」,而是回答三个每天都会问自己的问题。我把它们放在一个叫「今日」的笔记里,打开 Obsidian 第一眼就看这一页。

面板一:今天该做什么

跨全库收集未完成任务,按项目和截止日排序:

dataview
TASK
FROM "10 Areas" OR "20 Projects"
WHERE !completed
GROUP BY file.link
SORT rows.text ASC

如果任务太多,加一层过滤,只看本周:

dataview
TASK
FROM "20 Projects"
WHERE !completed AND (due <= date(today) + dur(7 days) OR !due)
SORT due ASC

注意 due 是任务行里的行内字段,写成 - [ ] 写完调色板 📅 2026-10-30,Tasks 插件或 Dataview 都能识别。

面板二:最近改过什么

我几乎不按日期找笔记,但需要知道「这周我到底动了什么」:

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 20

WITHOUT ID 很重要:默认的 File 列是重复信息,去掉之后表格宽度刚好放得下。

面板三:项目卡在哪

每个 Project 笔记的 frontmatter 里有一个 stage 字段,取值只有三个:进行中、卡住、待启动。面板只显示卡住的:

dataview
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 更直接:

dataviewjs
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 默认配置会明显拖慢启动。我做了三件事:

  1. 在设置里关掉 Enable JavaScript Queries 的全局刷新,只在需要的页面开 dataviewjs。
  2. 所有查询都写 FROM 限定目录,绝不写 FROM #tag 全库扫描。
  3. 移动端关闭 Dataview 的自动刷新,只在桌面端用驾驶舱。

如果某一页打开要超过 2 秒,先怀疑 WHERE 里用了 contains(file.content, ...)——那会读全文。换成标签或 frontmatter 字段。

别做成仪表盘地狱

我最初做了 11 个面板,结果是每天打开先看 11 个面板,然后什么也没做。现在只有 3 个,每个都对应一个具体动作:清任务、看最近、解卡点。面板数量应该等于你每天真正会做的决定数量,不是你能想到的统计维度数量。