这篇文章是 Obsidian Dataview 系列 系列 15 篇文章中的第 3 篇

Obsidian 官方为属性描述提供了 6 种数据类型:

  • 文本(Text):普通的文本以及文档链接(示例:link: "[[Link]]")文本。
  • 列表(List):包含多个普通文本的数组。
  • 数字(Number):包含整数,小数及负数。
  • 布尔值(Checkbox):要么是 true 或者 false,空值默认为 false
  • 日期(Date)和时间(Time):以格式 YYYY-MM[-DDTHH:mm:ss.nnn+ZZ] 的形式表示,比如:2024-04-25

Dataview 在则在此基础上额外提供了 2 种数据类型持续时间(Duration )和对象(Object)。
持续时间的语法为 <time> <unit>,例如:6 hours 或者 4 minutes,下面是更多的表达场景:

Example:: 7 hours
Example:: 16days
Example:: 4min
Example:: 6hr7min
Example:: 9 years, 8 months, 4 days, 16 hours, 2 minutes
Example:: 9 yrs 8 min

对象就是在一个父字段下多个字段的映射,只能定义在 YAML 中,例如:

---
obj:
  key1: "Val"
  key2: 3
  key3: 
    - "List1"
    - "List2"
    - "List3"
---

一、内联字段

Dataview 提供了一种内联字段,让我们可以在文档内容中任意位置定义数据。这种内联字段的语法允许你在不干扰文档主要内容的同时,为文档添加额外的元数据或信息。这些内联字段可以被 Dataview 插件识别并用于查询、过滤、排序等操作。

Basic Field:: Some random Value
**Bold Field**:: Nice!
带❤变量:: 我是表情+非拉丁字母
I would rate this a [rating:: 9]! It was [mood:: acceptable].

- [ ] Send an mail to David about the deadline [due:: 2022-04-05].

This will not show the (longKeyIDontNeedWhenReading:: key).

基础字段:`= this.basic-field`
加粗字段:`= this.bold-field`
在语句中:Rating: `= this.rating`, Mood: `= this.mood`
在任务列表中:`= this.due`
不显示变量名:`= this.longKeyIDontNeedWhenReading`
非常规变量:`= this.带❤变量`

下以是 Dataview 内联字段的一些基本规则和用法:

  1. 内联字段的定义

内联字段可以使用 字段名:: 字段值 的形式在文档内容中定义。

  1. 独占一行与位于文本内

如果内联字段是独占一行的,通常不需要加任何包裹字符。但如果内联字段在文本内部,确保它被 Dataview 正确识别,要将其放在方括号 [] 中。

  1. 变量名的命名规则

对于变量名,Dataview 允许使用英文、中文或表情符号来命名,建议尽可能使用英文来命名变量和字段。如果变量名使用空格来分隔的(例如:Foo bar),在内部会被表示成小写字母+连字符的方式(foo-bar),当然我们也可以直接使用 this["Foo bar"] 的方式来读取,但需要注意的是这里必须使用双引号。

  1. 渲染时隐藏变量名

如果您想在渲染时只显示值而不显示变量名,可以使用圆括号 () 包裹整个内联字段。但请注意,这并不会影响 Dataview 的查询功能,只是改变了它在文档中的显示方式。

二、默认属性

Obsidian 中每个文档都有一系列默认的属性,最常见的就是 tags, aliasescssclasses,分别表示页面的标签、别名和样式类名。此外,还有一些和发布相关的,暂时我们不关注,可自行查阅官方文档。

Dataview 为每个文档自动生成了一个 file 的属性,用于访问文件相关的信息。

文件属性 字段类型 属性说明
file.name Text 文件名
file.folder Text 所在文件夹
file.path Text 文件路径(包含文件名)
file.ext Text 扩展名
file.link Link 文件的链接地址
file.size Number 文件大小 (bytes)
file.ctime Date with Time 创建时间
file.cday Date 创建日期
file.mtime Date with Time 最后修改时间
file.mday Date 最后修改日期
file.tags List 文档中所有标签的数组。子标签按每个级别细分,因此 #Tag/1/A  将存储在数组中,作为 [#Tag, #Tag/1, #Tag/1/A]
file.etags List 同上,但是只存储最终的 [#Tag/1/A]
file.inlinks List 反向链接
file.outlinks List 正向链接
file.tasks List 文中的任务列表
file.lists List 文中的列表 (包含任务列表)
file.frontmatter List 文件中的 YAML 块内容
file.day Date 如果文件名使用日期定义(格式为 yyyy-mm-dd 或者 yyymmdd),则返回其日期值。
file.starred Boolean 是否使用核心插件 “Bookmarks” 标记过。

示例:

TABLE file.name AS 文件名, file.ctime AS 创建时间, file.mtime AS 修改时间, file.tags AS 标签
WHERE file = this.file

三、任务相关属性

使用 TASK 查询类型,我们可以查询所有文档中的任务(又叫待办事项)。下面我们创建几个不同类型的任务,并使用内联属性指定创建日期(created),开始日期(start),计划日期 (scheduled),截止日期(due),取消日期(cancelled)和完成日期(completion)几个属性。

- [ ] 任务创建 [created:: 2024-04-25]
- [ ] 任务开始 [start:: 2024-04-26]
- [ ] 任务开始2 [start:: 2024-04-22]
- [x] 任务完成
    - [x] 子任务完成 1 
    - [ ] 子任务未完成 1
    - [x] 子任务完成 2 [completion:: 2024-04-28]
- [x] 任务全部完成
    - [x] 完成 1
    - [x] 完成 2

下面我们来查询任务开始日期为 2024-04-22 的任务:

```dataview
TASK
WHERE start = date("2024-04-22")

结果:

在 Obsidian 的 Dataview 插件中,completed 和 fullyCompleted 是两个与任务(即使用复选框的待办事项)相关的属性。这两个属性在查询和过滤任务时非常有用,但它们具有不同的含义和用途。

  • completed
    completed 属性是一个布尔值(true 或 false),用于指示任务是否已被标记为完成。如果一个任务项(即一个带有复选框的列表项)被勾选(即标记为完成),则 completed 属性将为 true;如果未被勾选,则为 false
```dataview
TASK
WHERE file = this.file AND completed

结果:

  • fullyCompleted
    fullyCompleted 属性也用于指示任务是否完成,但它考虑的是嵌套任务(即嵌套在另一个任务下的子任务)的完成情况。如果一个任务及其所有子任务都已被标记为完成,则 fullyCompleted 属性将为 true。即使主任务被标记为完成,但如果它有任何子任务尚未完成,fullyCompleted 仍将为 false
```dataview
TASK
WHERE file = this.file AND fullyCompleted

结果:

下面给出 Dataview 为列表和任务提供的内置属性,更多操作参考后面的综合实例部分。

字段名 数据类型 描述
status Text 返回完成状态文本([]中的文本)" " 表示未完成, 表示已完成,也支持自定状态来替代默认的。
checked Boolean 用于判断当前状态是否为空,也就是说 [] 中有内容,但不一定是 x,也排除
completed Boolean 判断任务是否完成,不要求所有子任务都完成,如果使用非  来标记完成,例如 [-] ,那么不会被包含在结果中。
fullyCompleted Boolean 同上,但要求所有子任务完成才算完成。
text Text 任务的纯文本,包含属性和批注。
visual Text 由 Dataview 渲染出的任务文本,可以使用 Dataviewjs 来覆盖实现自定义渲染效果,同时保留验证逻辑的正确性。
line Number 任务在文档中所在的行数。
lineCount Number 任务占据的行数,包含子任务的任务会占用多行。
path Text 任务所在的文档路径。
section Link 任务所在章节链接。
tags List 任务中包含的标签。
outlinks Link 任务中定义的任何链接。
link Link 指向任务最近可被链接的区域的链接,对于通过链接指向到当前任务十分有用。
children List 当前任务的子任务列表。
task Boolean 通过这个属性来判断当前项是否为任务。
annotated Boolean 用于判断当前任务项是否包含属性。
parent Number 用于获取子任务的父任务所在行号,如果当前任务为根任务则为空值。
blockId Text 如果使用 ^blockId 语法定义了块ID,则返回其对应的任务或者列表。

四、Tasks 插件属性

obsidian-tasks 是一个流行的 Obsidian 插件,用于增强 Obsidian 中的任务管理功能。后续文章会专门探讨,现在我们只需要关注它提供的任务分类状态表情速记符(emoji-shorthands),让我们不用自己来使用内联属性定义任务状态,它直接开箱即用提供了以下几种速记语法:

属性名 速记语法 解释
due 🗓️YYYY-MM-DD 截止日期
completion ✅YYYY-MM-DD 完成日期
created ➕YYYY-MM-DD 创建日期
start 🛫YYYY-MM-DD 开始日期
scheduled ⏳YYYY-MM-DD 计划日期

除此之外,还有优先级等速记符,这里不再展开。

我们下载插件后,使用 【Ctrl/CMD + P】打开命令面板,然后输入命令 Tasks: Create or edit,会弹出一个对话框让你输入任务描述,优先级,是否循环等,下面是我创建的 3 个任务:

- [ ] 早上跑步 🔁 every day ➕ 2024-04-26 🛫 2024-04-27 📅 2024-04-27
- [x] 早上跑步 🔁 every day ➕ 2024-04-26 🛫 2024-04-26 📅 2024-04-26 ✅ 2024-04-26
- [ ] 看书 ➕ 2024-04-26
- [ ] 上班 ⏫ ➕ 2024-04-26 🛫 2024-04-26 📅 2024-04-26

现在我们来查询当前文档中 4 月 26 日完成的任务:

```dataview
TASK
WHERE completion = date("2024-04-26") AND file = this.file

结果:

系列目录<< Obsidian插件Dataview —— YAML简介(二)Obsidian插件Dataview —— 数据查询(四) >>