- Obsidian插件Dataview —— 安装与设置(一)
- Obsidian插件Dataview —— YAML简介(二)
- Obsidian插件Dataview —— 认识属性(三)
- Obsidian插件Dataview —— 数据查询(四)
- Obsidian插件Dataview —— DQL查询语言详解(五)
- Obsidian插件DataviewJS —— TypeScript速成(六)
- Obsidian插件Dataview —— 深入理解DataviewJS(七)
- Obsidian插件Dataview —— JavaScript API 快速入门(八)
- Obsidian插件Dataview —— DataArray接口介绍(九)
- Obsidian插件Dataview —— Dataviewjs JavaScript API 进阶用法(十)
- Obsidian插件Dataview —— Luxon库介绍(十一)
- Obsidian插件Dataview —— 实用案例讲解(初级篇)(十二)
- Obsidian插件Dataview —— 实用案例讲解(中级篇)(十三)
- Obsidian插件Dataview —— 实用案例讲解(高级篇)(十四)
- Obsidian插件Dataview —— 函数合集(十五)
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 内联字段的一些基本规则和用法:
- 内联字段的定义
内联字段可以使用 字段名:: 字段值
的形式在文档内容中定义。
- 独占一行与位于文本内
如果内联字段是独占一行的,通常不需要加任何包裹字符。但如果内联字段在文本内部,确保它被 Dataview 正确识别,要将其放在方括号 []
中。
- 变量名的命名规则
对于变量名,Dataview 允许使用英文、中文或表情符号来命名,建议尽可能使用英文来命名变量和字段。如果变量名使用空格来分隔的(例如:Foo bar
),在内部会被表示成小写字母+连字符的方式(foo-bar
),当然我们也可以直接使用 this["Foo bar"]
的方式来读取,但需要注意的是这里必须使用双引号。
- 渲染时隐藏变量名
如果您想在渲染时只显示值而不显示变量名,可以使用圆括号 ()
包裹整个内联字段。但请注意,这并不会影响 Dataview 的查询功能,只是改变了它在文档中的显示方式。
二、默认属性
Obsidian 中每个文档都有一系列默认的属性,最常见的就是 tags
, aliases
和 cssclasses
,分别表示页面的标签、别名和样式类名。此外,还有一些和发布相关的,暂时我们不关注,可自行查阅官方文档。
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
结果: