🔀 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 × 7list
✨ AI 相关表格 - AI 相关.basetable
🧰 工具与网站表格 - 工具与网站.basetable
📝 全部笔记表格 - 全部笔记.basetable
🧹 维护列表 - 收件箱超两周.base / 列表 - 缺 type.base / 表格 - 链接待验证.baselist / 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 → string
  • size → number

⚠️ 2026-10-02 起时间列不再用 file.mtime / file.ctime。那两个字段取的是文件
系统时间
,git pull / git checkout 会把它们改写成操作时刻,反映不了笔记真实
的创建与修改时间。现已改读 frontmatter 的 note.modified / note.created
——值是字符串,排序按字典序(该格式定宽零填充,字典序即时间序)。
见 Quartz 5 配置指南。

两个隐式行为(最容易被坑)

  1. isEmpty() 对「属性缺失」和「空数组」都返回 true。所以「缺 type」的判断写一个 type.isEmpty() 就够,不用先判 hasProperty("type")。
  2. 比较一侧为 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: 85

file.* 保持原样。两个命名空间混用,写错不报错,只是列宽不生效。

❌ 明确放弃的三项

放弃项和理由一起记,下次不用重新论证。

放弃项原因现状
board 视图按 type 分列1.13.7 没有 board改为 7 个独立 list 视图
「检查项 | 数量 | 笔记」汇总表Bases 无 group-by、无跨条目计数3 个独立视图,数量看视图头
「✅ 无需整理」空状态提示做不出来空视图就是空的,接受

⚠️ 补充一条:board 是 Quartz 侧 BasesPage 插件支持的视图类型,不是 Obsidian 侧的。也就是说网页端反而能做出 board——以后想加是可行的。

🐛 顺带修的 3 个 filter bug

迁移过程本身就是次审计:

文件原 filter应为
列表 - model.basetype.contains("concept")"model"
列表 - practice.basetype.contains("prictice")"practice"(拼写)
列表 - concept.basetype.contains("skill")"concept"

三个都是「列表显示出来的内容跟标题对不上」,肉眼能看出来但不查 filter 找不到原因。

✅ 结论

  • Dataview 插件可以永久移除,验收标准达成
  • 用 7 个独立 base 文件替代 board 分列是可接受的降级,且 filter 一目了然、出问题好定位
  • 相对日期用原生 Duration 语法,别用毫秒魔法数
  • 迁移的主要收益是审计:3 个写错的 filter 都是迁移时才发现的

⏭️ 后续

  • 升级到新的 Obsidian 版本后,回归验证 Bases 的运算符和 Duration 语法(非官方文档化写法)
  • Quartz 5 配置指南 侧的 BasesPage 兼容性是独立风险,见该笔记

相关


状态记录

  • 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 配置指南 同类。