Bases 数据库高级教程
Obsidian Bases 是 Obsidian 1.9+ 引入的内置数据库功能,让你可以像使用 Notion 数据库一样管理和查询笔记。本文深入探讨 Bases 的高级用法。
前置要求
- Obsidian 1.9 及以上版本
- 了解 Properties 属性系统 基础
- 建议先阅读 Bases 基础教程
Bases 进阶概念
数据模型
笔记文件(Markdown + Front Matter)
↓
Properties(属性 = 数据字段)
↓
Bases View(视图 = 查询 + 展示)每个 Bases 视图本质上是一个 .base 文件,它定义了:
- 数据源:从哪些文件夹/标签获取笔记
- 筛选条件:哪些笔记被包含
- 排序规则:笔记的排列顺序
- 展示字段:哪些属性字段被显示
- 视图类型:表格、卡片、看板等
.base 文件结构
yaml
# projects.base
filters:
and:
- file.folder == "projects"
- status != "archived"
formulas:
days_left: |
dateformat(date(deadline) - date(today), "d")
is_urgent: |
if(days_left < 7 && status != "done", "🔴", "🟢")
views:
- type: table
name: 所有项目
order: [name, status, priority, deadline, is_urgent, days_left]
- type: cards
name: 项目卡片
order: [name, status, deadline]高级筛选
组合筛选条件
yaml
filters:
and:
# 基础条件
- file.folder.startsWith("projects")
- status != "archived"
# 日期范围
- deadline >= date(today)
- deadline <= date(today) + dur(30 days)
# 多值匹配
- any(tags, "#urgent")
# 属性存在性检查
- priority != null
# 公式条件
- days_left < 14动态筛选
利用公式实现动态筛选:
yaml
formulas:
# 计算是否逾期
is_overdue: |
deadline < date(today) && status != "done"
# 计算项目健康度
health: |
if(
status == "done", "✅ 完成",
if(is_overdue, "🔴 逾期",
if(days_left < 7, "🟡 紧急", "🟢 正常"))
)
filters:
and:
- file.folder == "projects"
- health != "✅ 完成"多视图配置
表格视图 + 卡片视图 + 看板视图
yaml
views:
# 全部项目表格
- type: table
name: 📋 全部
order:
- file.link
- status
- priority
- deadline
- health
- days_left
sort:
- property: deadline
direction: asc
# 按状态分组的看板
- type: board
name: 📌 看板
groupBy: status
order:
- file.link
- priority
- deadline
sort:
- property: priority
direction: desc
# 卡片视图
- type: cards
name: 🎴 卡片
cardSize: 200
order:
- file.link
- status
- deadline
- health
sort:
- property: deadline
direction: asc公式字段
日期计算
yaml
formulas:
# 距截止天数
days_left: |
dateformat(date(deadline) - date(today), "d")
# 项目持续天数
duration_days: |
if(
completed_date != null,
dateformat(date(completed_date) - date(start_date), "d") + "天",
dateformat(date(today) - date(start_date), "d") + "天(进行中)"
)
# 月份分组
month_group: |
dateformat(date(deadline), "yyyy-MM")条件渲染
yaml
formulas:
# 优先级标签
priority_label: |
if(
priority == 1, "🔴 P1 紧急",
if(priority == 2, "🟡 P2 重要",
if(priority == 3, "🟢 P3 一般", "⚪ 未设定"))
)
# 进度条
progress_bar: |
let(
pct: if(total_tasks > 0, round(done_tasks / total_tasks * 100), 0),
filled: floor(pct / 10),
"▓".repeat(filled) + "░".repeat(10 - filled) + " " + pct + "%"
)关联字段
管理笔记间的关系
通过 Properties 建立笔记间的引用关系,然后在 Bases 中展示:
markdown
---
# 项目笔记的 frontmatter
name: "网站重构项目"
status: active
priority: 1
deadline: 2026-08-15
team: "[[张三]], [[李四]], [[王五]]"
related_tasks: "[[任务1]], [[任务2]], [[任务3]]"
parent_project: "[[季度规划]]"
---在 Bases 视图中展示关联数据:
yaml
views:
- type: table
name: 项目关系图
order:
- file.link # 项目名称(链接)
- status # 项目状态
- team # 团队成员(链接列表)
- related_tasks # 关联任务(链接列表)
- parent_project # 父项目(链接)反向引用查询
查询哪些笔记引用了当前项目:
yaml
# 在 Bases 中使用 file.inlinks
formulas:
referenced_by: |
file.inlinks
.map(l => "[[" + l + "]]")
.join(", ")实战案例
案例 1:个人 CRM 系统
yaml
# contacts.base
filters:
and:
- file.folder == "contacts"
- type == "contact"
formulas:
days_since_contact: |
dateformat(date(today) - date(last_contact), "d")
contact_status: |
if(
days_since_contact < 7, "🟢 活跃",
if(days_since_contact < 30, "🟡 需跟进",
if(days_since_contact < 90, "🟠 冷淡", "🔴 需重新联系"))
)
views:
- type: table
name: 联系人总览
order:
- file.link
- company
- role
- last_contact
- contact_status
- days_since_contact
sort:
- property: last_contact
direction: desc
- type: board
name: 按状态分组
groupBy: contact_status
order:
- file.link
- company
- last_contact案例 2:习惯追踪仪表板
yaml
# habits.base
filters:
and:
- file.folder == "habits"
- type == "habit"
formulas:
# 本周完成天数
week_count: |
sum(map([0,1,2,3,4,5,6], (i) =>
if(prop("d" + i) == true, 1, 0)
))
# 连续打卡天数
streak: |
# 从今天往前数连续打卡天数
streak_count
# 完成率
completion_rate: |
if(week_count > 0, round(week_count / 7 * 100) + "%", "0%")
views:
- type: table
name: 习惯追踪
order:
- file.link
- week_count
- completion_rate
- streak
- d0 # 周一
- d1 # 周二
- d2 # 周三
- d3 # 周四
- d4 # 周五
- d5 # 周六
- d6 # 周日案例 3:阅读管理库
yaml
# library.base
filters:
and:
- file.folder == "books"
- type == "book"
formulas:
reading_progress: |
if(
status == "read", "✅ 已读完",
if(status == "reading",
"📖 阅读中 " + round(current_page / total_pages * 100) + "%",
"📋 待阅读")
)
pages_per_day: |
if(
started_date != null && finished_date != null,
round(total_pages / max(1, dateformat(date(finished_date) - date(started_date), "d"))) + " 页/天",
"—"
)
views:
- type: table
name: 书库总览
order:
- file.link
- author
- status
- rating
- reading_progress
- pages_per_day
- started_date
- finished_date
sort:
- property: rating
direction: desc与 Dataview 对比
| 特性 | Bases | Dataview |
|---|---|---|
| 内置功能 | ✅ | ❌ 需插件 |
| 视图类型 | 表格/卡片/看板 | 代码控制 |
| 公式支持 | ✅ 基础 | ✅ 完整 JS |
| 交互编辑 | ✅ 直接编辑 | ❌ 只读 |
| 性能 | ✅ 优化好 | ⚠️ 数据量大时慢 |
| 自定义 UI | 有限 | ✅ 灵活 |
| 学习门槛 | 低 | 中-高 |
| 跨平台同步 | ✅ | ✅ |
建议:日常数据管理用 Bases,复杂查询和自定义展示用 Dataview,两者配合使用效果最佳。
最佳实践
1. 命名规范
markdown
# 属性命名使用 snake_case
status: active
created_date: 2026-01-15
last_modified: 2026-07-13
# 视图名称使用 emoji + 描述
📋 全部项目
📌 看板视图
📊 统计概览2. 数据分层
vault/
├── bases/ # .base 文件存放
│ ├── projects.base
│ ├── contacts.base
│ └── library.base
├── projects/ # 项目笔记
├── contacts/ # 联系人笔记
└── books/ # 书籍笔记3. 模板配合
创建笔记时自动填充属性:
markdown
<!-- templates/project-template.md -->
---
name: "{{title}}"
status: active
priority: 3
created_date: {{date}}
deadline:
team: []
tags: [project]
---常见问题
Bases 和 Dataview 用哪个?
- Bases:适合需要交互编辑、看板视图、简单数据管理的场景
- Dataview:适合复杂查询、自定义渲染、跨笔记计算的场景
- 两者不互斥,可以同时使用
Bases 性能如何?
Bases 是 Obsidian 内置功能,性能经过官方优化,处理上千条记录仍能保持流畅。建议合理使用筛选条件,避免在视图中显示过多字段。
.base 文件可以同步吗?
可以。.base 文件是纯文本 YAML 格式,完全兼容 Obsidian Sync 和 Git 版本控制。
相关文档
- Bases 数据库 — 基础教程
- Bases 数据库速查表 — 语法速查
- Properties 完整指南 — 属性系统详解
- Properties 高级用法 — 进阶技巧
- Dataview 实战指南 — Dataview 入门