Skip to content

Bases 数据库高级教程

Obsidian Bases 是 Obsidian 1.9+ 引入的内置数据库功能,让你可以像使用 Notion 数据库一样管理和查询笔记。本文深入探讨 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 对比

特性BasesDataview
内置功能❌ 需插件
视图类型表格/卡片/看板代码控制
公式支持✅ 基础✅ 完整 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 版本控制。

相关文档