🔀 Dataview 迁移到 Bases 实践
🗓️ 完成:2026-09-29 · Obsidian 1.13.7
🎯 背景
首页 首页.md 原本用 11 个 Dataview / DataviewJS 块做分类展示。目标是全部换成 Obsidian 原生 Bases,然后把 Dataview 插件删掉——插件删干净是这次迁移的验收标准。
🛠️ 最终形态
Dataview 已从 community-plugins.json 移除、插件目录已删、全库 0 处引用。首页现有 13 个 base embed、0 个 live dataview 块:
| 区域 | 文件 | 视图 |
|---|---|---|
| 7 个 type 分类 | 列表 - <type>.base × 7 | list |
| ✨ AI 相关 | 表格 - AI 相关.base | table |
| 🧰 工具与网站 | 表格 - 工具与网站.base | table |
| 📝 全部笔记 | 表格 - 全部笔记.base | table |
| 🧹 维护 | 列表 - 收件箱超两周.base / 列表 - 缺 type.base / 表格 - 链接待验证.base | list / list / table |
命名约定:附件/ 下的 base 文件名前缀 = 视图类型。表格 - 对应 type: table,列表 - 对应 type: list。这个约定是为了让「文件名」和「实际视图」对不上时能一眼看出来——迁移过程中 3 个 base 的 filter 写错,就是靠扫文件名才发现的。
⚙️ Bases 能力边界
从 Obsidian 1.13.7 本体反推,均已在本 vault 实测。
视图类型
只有三种:table / cards / list。没有 board——这是本次迁移与原计划最大的偏差,见「明确放弃的三项」。
运算符
字段方法:hasProperty、isEmpty、startsWith、endsWith、contains、containsAny、containsAll、matches、hasLink、inFolder、hasTag
比较运算符:==、!=、<、>、<=、>=
⚠️ containsAny 对字符串也生效,不只对列表。缺 type.base 就是这么写的:
filters:
and:
- file.folder.containsAny("笔记", "收件箱")字段类型
note.modified/note.created→ string(frontmatter 原值,YYYY-MM-DD HH:mm:ss)file.folder/file.name→ stringsize→ number
⚠️ 2026-10-02 起时间列不再用
file.mtime/file.ctime。那两个字段取的是文件
系统时间,git pull/git checkout会把它们改写成操作时刻,反映不了笔记真实
的创建与修改时间。现已改读 frontmatter 的note.modified/note.created
——值是字符串,排序按字典序(该格式定宽零填充,字典序即时间序)。
见 Quartz 5 配置指南。
两个隐式行为(最容易被坑)
isEmpty()对「属性缺失」和「空数组」都返回 true。所以「缺 type」的判断写一个type.isEmpty()就够,不用先判hasProperty("type")。- 比较一侧为 null 时返回 null,判假。也就是说
verified < (now() - "180 days")会自动排除掉所有没有verified字段的笔记——不需要额外写「verified 必须存在」。这反过来是个风险:如果你希望缺字段的笔记也进结果,写不出来。
📅 日期计算:死路到活路
相对日期是本 vault 最需要的能力(收件箱超两周、链接超半年)。
死路:Date 类型只有 date / format / isEmpty / relative / time 五个方法,没有加减法、没有 addDays。第一反应是用毫秒魔法数绕过:
file.mtime < (now().timestamp - 1209600000)
能跑,但下次维护的人得自己换算「14 天 = 多少毫秒」。
活路:公式引擎里有原生 Duration 类型。date - 字符串 会先把字符串解析成 Duration 再做减法:
file.mtime < (now() - "14 days")
verified < (now() - "180 days")
Duration.parseFromString 两种格式都认:
- 自然语言:
"14 days"、"180 days" - ISO 8601:
"P14D"、"P6M"
Duration 还能按数字乘除("7 days" * 2)。now() 和 today() 是全局函数。
🕳️ 踩坑
Obsidian 版本识别陷阱(最值得单独记的一条)
/Applications/Obsidian.app 自报版本 1.5.12,但那只是 bootstrap 壳子。真实本体是从 ~/Library/Application Support/obsidian/obsidian-1.13.7.asar 加载的。
后果很具体:拿壳子的 app.js 去 grep Bases,什么都找不到,于是得出「Bases 视图不存在」的错误结论,然后开始怀疑人生。
正确做法:先解出真正的 asar 再查。
npx @electron/asar extract ~/Library/Application\ Support/obsidian/obsidian-1.13.7.asar /tmp/obsidian-real
grep -c "bases" /tmp/obsidian-real/app.js⚠️ 每次升级 Obsidian 这条都要重验一遍,Bases 的语法和行为都在快速变动。
type 列表字段的静默空结果
迁移前 Dataview 时代就踩过:type 改成列表后,DQL 必须写 contains(type, "x"),写 type = "x" 不报错,静默返回空表——看起来就是「没笔记」,很容易误判成数据问题。Bases 侧对应写法是 type.contains("x"),写错同样静默。
这个坑详见 模板说明 > ⚠️ 已验证的坑。
columnSize 的字段名前缀和 filter 不一样
filter 表达式里字段名是裸的:status、verified、type。
但 columnSize 的键要加 note. 前缀:
columnSize:
note.verified: 86
note.icon: -40
file.ctime: 85file.* 保持原样。两个命名空间混用,写错不报错,只是列宽不生效。
❌ 明确放弃的三项
放弃项和理由一起记,下次不用重新论证。
| 放弃项 | 原因 | 现状 |
|---|---|---|
board 视图按 type 分列 | 1.13.7 没有 board | 改为 7 个独立 list 视图 |
| 「检查项 | 数量 | 笔记」汇总表 | Bases 无 group-by、无跨条目计数 | 3 个独立视图,数量看视图头 |
| 「✅ 无需整理」空状态提示 | 做不出来 | 空视图就是空的,接受 |
⚠️ 补充一条:board 是 Quartz 侧 BasesPage 插件支持的视图类型,不是 Obsidian 侧的。也就是说网页端反而能做出 board——以后想加是可行的。
🐛 顺带修的 3 个 filter bug
迁移过程本身就是次审计:
| 文件 | 原 filter | 应为 |
|---|---|---|
列表 - model.base | type.contains("concept") | "model" |
列表 - practice.base | type.contains("prictice") | "practice"(拼写) |
列表 - concept.base | type.contains("skill") | "concept" |
三个都是「列表显示出来的内容跟标题对不上」,肉眼能看出来但不查 filter 找不到原因。
✅ 结论
- Dataview 插件可以永久移除,验收标准达成
- 用 7 个独立 base 文件替代 board 分列是可接受的降级,且 filter 一目了然、出问题好定位
- 相对日期用原生
Duration语法,别用毫秒魔法数 - 迁移的主要收益是审计:3 个写错的 filter 都是迁移时才发现的
⏭️ 后续
- 升级到新的 Obsidian 版本后,回归验证 Bases 的运算符和
Duration语法(非官方文档化写法) - Quartz 5 配置指南 侧的 BasesPage 兼容性是独立风险,见该笔记
相关
- 首页 — 迁移对象
- 模板说明 —
type词表与字段约定,含 Dataview 时代的坑(已存档) - Quartz 5 配置指南 — 下游依赖,Bases 在网页端的渲染
openspec/changes/archive/2026-09-29-migrate-to-obsidian-bases/— 变更提案、设计记录、任务清单- Obsidian 1.8.0 发布说明(Bases 首次引入)
状态记录
- 2026-09-29:首次记录。7 个 type 分类列表、3 个汇总表、3 个维护视图全部迁移完成,Dataview 插件已移除。
- 2026-09-29:从 Obsidian 1.13.7 本体反推确认 Bases 无 board 视图、
Duration支持自然语言与 ISO 8601 两种格式。 - 2026-09-29:补齐「两个隐式行为」与
columnSize的note.前缀差异。 - 2026-09-29:
type从[practice, concept]改为[tool],补url/verified。原先的分类会把这篇非 AI 笔记带进首页「✨ AI 相关」(concept/practice曾被当成 AI 标记),改为tool后只进「🧰 工具与网站」,跟 Quartz 5 配置指南 同类。