通过 Dataview 查看文件中隐藏的“秘密”
本文主要介绍了:
- 如何查看一个文件里面所有的隐式字段;
- 每一个字段的含义;
- 具体的查看某一个特定的隐式字段的方法;
文件中的一些已经自动有索引的内容,比如文件的名字,文件的创建时间、修改时间等,我们称之为文件的隐式字段。他们也是能够被 Dataview 检索到的。
文件的隐式字段有两种
- 文件自动索引的字段:file;
- 列表和任务的隐式字段:file.lists, file.tasks;
一、查看文件的隐式字段
在 10 - Metadata 元数据 中我们说过,输入下面的代码可以显示当前文件的所有元数据。
```dataview
TABLE this
WHERE file = this.file
limit 1
```
其中,file 就是该文件的隐式字段,它的数据类型是 object 对象。向文件添加了其他元数据(添加到前言或者用行内字段添加至正文),他们将与 file 属性处于同一级或覆盖 file 属性中的子属性(添加元数据时使用已有的属性名就能替换)。
Tip
- 无该属性值时会空着;
- 查询结果中会有一些属性值为
...
,这是因为 Dataview 的查询结果只会显示两级属性值;
可以用 this
指代本文件,用 this.file
特指是本文件的属性。不用 this
的时候泛指所有选中的文件。我们用点运算符 .
来调用更下一级的属性,如 file.path
是指文件的路径;
二、隐式字段的含义
大多数的属性的直接数据类型是 array 数组,下面的数据类型指代的是数组里面元素的类型;
file 隐式字段
属性名 (17) | 数据类型 | 解释 |
---|---|---|
file.path | string 字符串 | 文件的路径(相对于整个 Vault) |
file.folder | string 字符串 | 文件所属的文件夹的路径(相对于整个 Vault) |
file.name | string 字符串 | 文件名 |
file.link | link 链接 | 引用这篇文件时的链接 |
file.outlinks | link 链接 | 该文件外链 |
file.inlinks | link 链接 | 指向本文的文件的链接 |
file.etags | string 字符串 | 该文件的所有标签 例如文件中有标签 #A/B ,只会有 #A/B ; |
file.tags | string 字符串 | 该文件的所有标签,以及他们的各级标签 例如文件中有标签 #A/B ,就会有 #A/B 和 #A ; |
file.aliases | string 字符串 | 别名,添加元数据直接覆盖即可,可以取多个; 例如在 frontmatter 中写 aliases: [别名1, 别名2] |
file.lists | object 对象 | 文件中出现的所有列表的信息(任务是特殊的列表) |
file.tasks | object 对象 | 文件中出现的所有任务的信息 |
file.ctime | date 时间类型 | 文件的创建时间(c 代表 create 创建) |
file.mtime | date 时间类型 | 文件最后修改时间(m 代表 modify 修改) |
file.size | number 数字 | 文件的大小(单位为 byte) |
file.starred | boolean 布尔类型 | 文件是否被星标(核心插件星标已经被书签替代) 该属性无法被覆盖,书签标记也无法令其为 true |
file.frontmatter | object 对象 | 前言中的元数据 |
file.ext | string 字符串 | 文件的拓展名(ext 是 extension 的缩写) |
列表和任务的隐式字段
他们的能用 file.lists
和 file.tasks
调用
试下将上面的 Dataview 代码中第一行的 this 改成 file.lists
和 file.tasks
;
(最后的 limit 1
是限制 dataview 只输出一个查询结果,防止查询结果过长导致的卡顿。)
```Dataview
table file.lists, file.tasks
where file = this.file
limit 1
```
在 file.lists
中我们提到过,任务是一种特殊的列表(从他们的语法也能看出来),因此任务有所有列表有的属性,还有列表没有的属性(status, checked, completed, fullyCompeleted),后面只用列表统称两者;
任务和列表都有的属性
属性名 | 数据类型 | 解释 |
---|---|---|
symbol | array 数组 | 符号 |
link | link 链接 | 该列表上方最近的可链接的标题 |
section | link 链接 | 该列表上方最近的可链接的标题(与 link 一致) |
text | string 字符串 | 列表的正文 |
tags | array 数组 | 该列表中所有的标签 |
line | number 数字 | 该列表所在行 |
lineCount | number 数字 | 次列表占用的行数 |
list | number 数字 | 该组列表的起始行 |
outlinks | link 链接 | 该列表的外链 |
path | string 字符串 | 列表所处的文件的路径 |
children | array 数组 | 列表的子列表和子列表的子列表 |
task | boolean 布尔类型 | 判断该列表是不是一个任务,值为 true 时是任务 |
annotated | boolean 布尔类型 | 判断该列表是否包含元数据 |
position | object 对象 | 包含了这组列表的位置的起始信息 |
subtasks | object 对象 | 列表的子列表和子列表的子列表(与 children 一致) |
real | boolean 布尔类型 | 判断该列表是不是一个任务,值为 true 时是任务(与 task 一致) |
header | link 链接 | 该列表上方最近的可链接的标题(与 link 和 section 一致) |
position
位置 位置属性的数据类型是对象,它的子属性有 start
和 end
,他们的数据类型都是 object 对象,分别代表记录了这个列表的起始位置。它们的子属性有 line
、col
和 offset
。
position.start.line
和position.end.line
都代表该列表所在行(不是列表组);position.start.col
代表第一个字符所在列,position.end.col
代表最后一个字符所在列;position.start.offset
代表文件开头到列表第一个字符所含的字符数,position.end.offset
代表文件开头到列表最后一个字符所含的字符数;
子列表 subtasks 和 children
这两个属性结果一致,数据类型是 object 对象。他们的其他属性前面都出现过,只有一个新的属性 parent
还没出现过。parent
的数据类型是 number 数字,代表他们的上级所在行。
用简写语法 (Shorthand Syntax) 定义的五个属性
在 12 - 添加元数据至列表和任务 中我们提到,使用图标简写语法可以为列表或任务添加五个属性
属性名 | 数据类型 | 解释 |
---|---|---|
due | date 时间 | 截止日期 |
completion | date 时间 | 完成日期 |
created | date 时间 | 创建日期 |
start | date 时间 | 开始日期 |
scheduled | date 时间 | 预期完成日期 |
任务特有的属性
属性名 | 数据类型 | 解释 |
---|---|---|
status | string 字符串 | 任务的语法中,方括号内的字符(一般完成为 x) |
checked | boolean 布尔类型 | 方括号内是否有非空格字符(不一定是 x) |
completed | boolean 布尔类型 | 只有方括号内为 x 才为 true |
fullyCompleted | boolean 布尔类型 | 任务及其所有子任务是否完成 |
上面的属性中,有不少属性之间的含义是完全一样的,有的属性之间只有细微差别
由于
file.tasks
只比file.lists
多了一些属性,下面只列举了file.lists
的部分,可以把 lists 改为 tasks 即可得到file.tasks
的对应属性。完全相同的属性
file.path
和file.lists.path
;link
、section
和header
;position.start.line
和position.end.line
;file.lists.children
和file.lists.subtasks
;file.lists.task
和file.lists.real
;相近但不相等的属性
file.etags
和file.tags
;file.lists
和file.tasks
;file.lists.check
、file.lists.completed
和file.lists.fullyCompleted
;
三、具体查看隐式字段
这里只给出简单的 Dataview 代码,现在还不理解没关系,对应上面看懂属性的含义,知道在做什么即可
查询文件自带的元数据的属性
用查询文件的创建时间和最后一次修改时间举例,上文我们已经说过他们对应的属性名是 file.ctime
和 file.mtime
,中间用逗号分割。将下面的代码直接放在正文中即可。(你也可以自己试试查询别的属性)
```dataview
table file.ctime, file.mtime
where file = this.file
```
简单解释一下这两行代码在做什么,更具体的请看 21 - 查询类型 和 23 - 操作符
- 第一行是确定以表 table 的形式显示查询结果,以及查询文件的创建日期和最后一次修改时间;
- 第二行是将搜索范围缩小到 this file,也就是这段代码所在的文件;
查询列表和任务的元数据
列表和任务是在 file 属性下的子属性 file.lists
和 file.tasks
,我们这里查询列表的正文 text
```dataview
table file.lists.text, file.tasks.text
where file = this.file
```
这段代码能查询到你当前文件的列表和任务的正文
查询属性的数据类型
上面我们给出了所有隐式字段的数据类型,其实可以用 函数 typeof() 手动查询,括号内填想要查询的属性值,函数就会返回数据类型。
- 当输入值为属性值时
```dataview
table typeof(file), typeof(file.lists.link)
where file = this.file
```
可以看到我们这里一共查询了三个属性,file
, file.lists.link
, 。这时候你可能想问,明明上文说了 file.lists.link
的数据类型是 link 链接,为什么查询出来的结果是 array 数组。这是因为上文给出的数据类型都是最终的数据类型,也就是数组内的元素的数据类型,可以试试查下 file.lists.link[0]
的数据类型,也就是 file.lists.link
这个数组中的第一个元素的数据类型。(用方括号取数组中的元素,下标从 0 开始)
- 当输入值为普通值时
```dataview
table without id typeof("这里的值可以换成下面的")
limit 1
```
输入 | 输出 |
---|---|
typeof(8) | “number” |
typeof("text") | “string” |
typeof([1, 2, 3]) | “array” |
typeof({ a: 1, b: 2 }) | “object” |
typeof(date(2023-07-19)) | “date” |
typeof(dur(8 minutes)) | “duration” |
下一步,我们就开始学习基础语法之 15 - Literals 字面常量,或是返回 Dataview基本语法。
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。