ObsidianBases数据库视图技能Skill obsidian-bases

此技能用于在 Obsidian 笔记应用中创建和编辑 .base 文件,实现数据库-like视图、过滤器、公式和摘要功能,方便用户管理笔记、构建任务跟踪器、阅读列表、项目仪表板等。关键词:Obsidian, Bases, 数据库视图, 过滤器, 公式, YAML, 笔记管理, 动态视图。

其他 0 次安装 0 次浏览 更新于 3/8/2026

name: obsidian-bases category: document-processing description: 创建和编辑 Obsidian Bases(.base 文件),包括视图、过滤器、公式和摘要。当处理 .base 文件、创建笔记的数据库-like视图,或当用户在 Obsidian 中提到 Bases、表格视图、卡片视图、过滤器或公式时使用。

Obsidian Bases

此技能使 Claude Code 能够创建和编辑有效的 Obsidian Bases(.base 文件),包括视图、过滤器、公式和所有相关配置。

概述

Obsidian Bases 是基于 YAML 的文件,用于定义 Obsidian 保险库中笔记的动态视图。一个 Base 文件可以包含多个视图、全局过滤器、公式、属性配置和自定义摘要。

何时使用此技能

  • 在 Obsidian 中创建数据库-like视图的笔记
  • 构建任务跟踪器、阅读列表或项目仪表板
  • 通过属性或标签过滤和组织笔记
  • 创建计算/公式字段
  • 设置表格、卡片、列表或地图视图
  • 在 Obsidian 保险库中处理 .base 文件

文件格式

Base 文件使用 .base 扩展名并包含有效的 YAML。它们也可以嵌入到 Markdown 代码块中。

完整模式

# 全局过滤器应用于基础中的所有视图
filters:
  # 可以是单个过滤器字符串
  # 或具有 and/or/not 的递归过滤器对象
  and: []
  or: []
  not: []

# 定义可在所有视图中使用的公式属性
formulas:
  formula_name: 'expression'

# 配置属性的显示名称和设置
properties:
  property_name:
    displayName: "显示名称"
  formula.formula_name:
    displayName: "公式显示名称"
  file.ext:
    displayName: "扩展名"

# 定义自定义摘要公式
summaries:
  custom_summary_name: 'values.mean().round(3)'

# 定义一个或多个视图
views:
  - type: table | cards | list | map
    name: "视图名称"
    limit: 10                    # 可选:限制结果
    groupBy:                     # 可选:分组结果
      property: property_name
      direction: ASC | DESC
    filters:                     # 视图特定过滤器
      and: []
    order:                       # 按顺序显示的属性
      - file.name
      - property_name
      - formula.formula_name
    summaries:                   # 将属性映射到摘要公式
      property_name: Average

过滤器语法

过滤器用于缩小结果范围。可以全局应用或按视图应用。

过滤器结构

# 单个过滤器
filters: 'status == "done"'

# AND - 所有条件必须为真
filters:
  and:
    - 'status == "done"'
    - 'priority > 3'

# OR - 任何条件可以为真
filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

# NOT - 排除匹配项
filters:
  not:
    - file.hasTag("archived")

# 嵌套过滤器
filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")
    - not:
        - file.hasTag("book")
        - file.inFolder("Required Reading")

过滤器运算符

运算符 描述
== 等于
!= 不等于
> 大于
< 小于
>= 大于或等于
<= 小于或等于
&& 逻辑与
|| 逻辑或
! 逻辑非

属性

三种类型的属性

  1. 笔记属性 - 来自 frontmatter:note.author 或仅 author
  2. 文件属性 - 文件元数据:file.namefile.mtime
  3. 公式属性 - 计算值:formula.my_formula

文件属性参考

属性 类型 描述
file.name 字符串 文件名
file.basename 字符串 无扩展名的文件名
file.path 字符串 文件完整路径
file.folder 字符串 父文件夹路径
file.ext 字符串 文件扩展名
file.size 数字 文件大小(字节)
file.ctime 日期 创建时间
file.mtime 日期 修改时间
file.tags 列表 文件中的所有标签
file.links 列表 文件中的内部链接
file.backlinks 列表 链接到此文件的文件
file.embeds 列表 笔记中的嵌入
file.properties 对象 所有 frontmatter 属性

this 关键字

  • 在主内容区域:指基础文件本身
  • 当嵌入时:指嵌入文件
  • 在侧边栏:指主内容中的活动文件

公式语法

公式从属性计算值。在 formulas 部分定义。

formulas:
  # 简单算术
  total: "price * quantity"

  # 条件逻辑
  status_icon: 'if(done, "check", "pending")'

  # 字符串格式化
  formatted_price: 'if(price, price.toFixed(2) + " dollars")'

  # 日期格式化
  created: 'file.ctime.format("YYYY-MM-DD")'

  # 复杂表达式
  days_old: '((now() - file.ctime) / 86400000).round(0)'

函数参考

全局函数

函数 签名 描述
date() date(string): date 解析字符串为日期
duration() duration(string): duration 解析持续时间字符串
now() now(): date 当前日期和时间
today() today(): date 当前日期(时间 = 00:00:00)
if() if(condition, trueResult, falseResult?) 条件
min() min(n1, n2, ...): number 最小数字
max() max(n1, n2, ...): number 最大数字
number() number(any): number 转换为数字
link() link(path, display?): Link 创建链接
list() list(element): List 包装为列表(如果尚未)
file() file(path): file 获取文件对象
image() image(path): image 创建用于渲染的图像
icon() icon(name): icon 按名称的 Lucide 图标
html() html(string): html 渲染为 HTML
escapeHTML() escapeHTML(string): string 转义 HTML 字符

日期函数和字段

字段: date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond

函数 签名 描述
date() date.date(): date 移除时间部分
format() date.format(string): string 使用 Moment.js 模式格式化
time() date.time(): string 获取时间为字符串
relative() date.relative(): string 人类可读的相对时间
isEmpty() date.isEmpty(): boolean 对于日期始终为假

日期算术

# 持续时间单位:y/year/years, M/month/months, d/day/days,
#                 w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds

# 添加/减去持续时间
"date + \"1M\""           # 添加 1 个月
"date - \"2h\""           # 减去 2 小时
"now() + \"1 day\""       # 明天
"today() + \"7d\""        # 从今天起一周后

# 减去日期以获取毫秒差
"now() - file.ctime"

# 复杂持续时间算术
"now() + (duration('1d') * 2)"

字符串函数

字段: string.length

函数 描述
contains(value) 检查子字符串
containsAll(...values) 所有子字符串存在
containsAny(...values) 任何子字符串存在
startsWith(query) 以查询开头
endsWith(query) 以查询结尾
isEmpty() 为空或不存在
lower() 转换为小写
title() 转换为标题大小写
trim() 移除空白
replace(pattern, replacement) 替换模式
repeat(count) 重复字符串
reverse() 反转字符串
slice(start, end?) 子字符串
split(separator, n?) 拆分为列表

数字函数

函数 描述
abs() 绝对值
ceil() 向上取整
floor() 向下取整
round(digits?) 四舍五入到指定位数
toFixed(precision) 固定点表示法
isEmpty() 不存在

列表函数

字段: list.length

函数 描述
contains(value) 元素存在
containsAll(...values) 所有元素存在
containsAny(...values) 任何元素存在
filter(expression) 按条件过滤(使用 valueindex
map(expression) 转换元素(使用 valueindex
reduce(expression, initial) 减少为单个值(使用 valueindexacc
flat() 展平嵌套列表
join(separator) 连接为字符串
reverse() 反转顺序
slice(start, end?) 子列表
sort() 升序排序
unique() 移除重复项
isEmpty() 无元素

文件函数

函数 描述
asLink(display?) 转换为链接
hasLink(otherFile) 有链接到文件
hasTag(...tags) 有任一标签
hasProperty(name) 有属性
inFolder(folder) 在文件夹或子文件夹中

视图类型

表格视图

views:
  - type: table
    name: "我的表格"
    order:
      - file.name
      - status
      - due_date
    summaries:
      price: Sum
      count: Average

卡片视图

views:
  - type: cards
    name: "画廊"
    order:
      - file.name
      - cover_image
      - description

列表视图

views:
  - type: list
    name: "简单列表"
    order:
      - file.name
      - status

地图视图

需要纬度/经度属性和 Maps 插件。

views:
  - type: map
    name: "位置"

默认摘要公式

名称 输入类型 描述
Average 数字 数学平均值
Min 数字 最小数字
Max 数字 最大数字
Sum 数字 所有数字的和
Range 数字 最大值 - 最小值
Median 数字 数学中位数
Stddev 数字 标准差
Earliest 日期 最早日期
Latest 日期 最晚日期
Checked 布尔 真值计数
Unchecked 布尔 假值计数
Empty 任何 空值计数
Filled 任何 非空值计数
Unique 任何 唯一值计数

完整示例

任务跟踪器基础

filters:
  and:
    - file.hasTag("task")
    - 'file.ext == "md"'

formulas:
  days_until_due: 'if(due, ((date(due) - today()) / 86400000).round(0), "")'
  is_overdue: 'if(due, date(due) < today() && status != "done", false)'
  priority_label: 'if(priority == 1, "High", if(priority == 2, "Medium", "Low"))'

properties:
  status:
    displayName: Status
  formula.days_until_due:
    displayName: "距到期天数"
  formula.priority_label:
    displayName: 优先级

views:
  - type: table
    name: "活跃任务"
    filters:
      and:
        - 'status != "done"'
    order:
      - file.name
      - status
      - formula.priority_label
      - due
      - formula.days_until_due
    groupBy:
      property: status
      direction: ASC
    summaries:
      formula.days_until_due: Average

  - type: table
    name: "已完成"
    filters:
      and:
        - 'status == "done"'
    order:
      - file.name
      - completed_date

阅读列表基础

filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

formulas:
  reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
  status_icon: 'if(status == "reading", "reading", if(status == "done", "done", "to-read"))'
  year_read: 'if(finished_date, date(finished_date).year, "")'

properties:
  author:
    displayName: 作者
  formula.status_icon:
    displayName: ""
  formula.reading_time:
    displayName: "估计时间"

views:
  - type: cards
    name: "图书馆"
    order:
      - cover
      - file.name
      - author
      - formula.status_icon
    filters:
      not:
        - 'status == "dropped"'

  - type: table
    name: "阅读列表"
    filters:
      and:
        - 'status == "to-read"'
    order:
      - file.name
      - author
      - pages
      - formula.reading_time

项目笔记基础

filters:
  and:
    - file.inFolder("Projects")
    - 'file.ext == "md"'

formulas:
  last_updated: 'file.mtime.relative()'
  link_count: 'file.links.length'

summaries:
  avgLinks: 'values.filter(value.isType("number")).mean().round(1)'

properties:
  formula.last_updated:
    displayName: "更新于"
  formula.link_count:
    displayName: "链接数"

views:
  - type: table
    name: "所有项目"
    order:
      - file.name
      - status
      - formula.last_updated
      - formula.link_count
    summaries:
      formula.link_count: avgLinks
    groupBy:
      property: status
      direction: ASC

  - type: list
    name: "快速列表"
    order:
      - file.name
      - status

每日笔记索引

filters:
  and:
    - file.inFolder("Daily Notes")
    - '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)'

formulas:
  word_estimate: '(file.size / 5).round(0)'
  day_of_week: 'date(file.basename).format("dddd")'

properties:
  formula.day_of_week:
    displayName: "星期"
  formula.word_estimate:
    displayName: "~字数"

views:
  - type: table
    name: "最近笔记"
    limit: 30
    order:
      - file.name
      - formula.day_of_week
      - formula.word_estimate
      - file.mtime

嵌入基础

在 Markdown 文件中嵌入:

![[MyBase.base]]

<!-- 特定视图 -->
![[MyBase.base#View Name]]

YAML 引用规则

  • 使用单引号用于包含双引号的公式:'if(done, "Yes", "No")'
  • 使用双引号用于简单字符串:"我的视图名称"
  • 在复杂表达式中正确转义嵌套引号

常见模式

按标签过滤

filters:
  and:
    - file.hasTag("project")

按文件夹过滤

filters:
  and:
    - file.inFolder("Notes")

按日期范围过滤

filters:
  and:
    - 'file.mtime > now() - "7d"'

按属性值过滤

filters:
  and:
    - 'status == "active"'
    - 'priority >= 3'

组合多个条件

filters:
  or:
    - and:
        - file.hasTag("important")
        - 'status != "done"'
    - and:
        - 'priority == 1'
        - 'due != ""'

参考