通过 Dataview 查看文件中隐藏的“秘密”

通过 Dataview 查看文件中隐藏的“秘密”

本文主要介绍了:

  1. 如何查看一个文件里面所有的隐式字段;
  2. 每一个字段的含义;
  3. 具体的查看某一个特定的隐式字段的方法;

文件中的一些已经自动有索引的内容,比如文件的名字,文件的创建时间、修改时间等,我们称之为文件的隐式字段。他们也是能够被 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.pathstring 字符串文件的路径(相对于整个 Vault)
file.folderstring 字符串文件所属的文件夹的路径(相对于整个 Vault)
file.namestring 字符串文件名
file.linklink 链接引用这篇文件时的链接
file.outlinkslink 链接该文件外链
file.inlinkslink 链接指向本文的文件的链接
file.etagsstring 字符串该文件的所有标签
例如文件中有标签 #A/B ,只会有 #A/B
file.tagsstring 字符串该文件的所有标签,以及他们的各级标签
例如文件中有标签 #A/B ,就会有 #A/B#A
file.aliasesstring 字符串别名,添加元数据直接覆盖即可,可以取多个;
例如在 frontmatter 中写 aliases: [别名1, 别名2]
file.listsobject 对象文件中出现的所有列表的信息(任务是特殊的列表)
file.tasksobject 对象文件中出现的所有任务的信息
file.ctimedate 时间类型文件的创建时间(c 代表 create 创建)
file.mtimedate 时间类型文件最后修改时间(m 代表 modify 修改)
file.sizenumber 数字文件的大小(单位为 byte)
file.starredboolean 布尔类型文件是否被星标(核心插件星标已经被书签替代)
该属性无法被覆盖,书签标记也无法令其为 true
file.frontmatterobject 对象前言中的元数据
file.extstring 字符串文件的拓展名(ext 是 extension 的缩写)

列表和任务的隐式字段

他们的能用 file.listsfile.tasks 调用

试下将上面的 Dataview 代码中第一行的 this 改成 file.listsfile.tasks

(最后的 limit 1 是限制 dataview 只输出一个查询结果,防止查询结果过长导致的卡顿。)

```Dataview
table file.lists, file.tasks
where file = this.file
limit 1
```

file.lists 中我们提到过,任务是一种特殊的列表(从他们的语法也能看出来),因此任务有所有列表有的属性,还有列表没有的属性(status, checked, completed, fullyCompeleted),后面只用列表统称两者;

任务和列表都有的属性

属性名数据类型解释
symbolarray 数组符号
linklink 链接该列表上方最近的可链接的标题
sectionlink 链接该列表上方最近的可链接的标题(与 link 一致)
textstring 字符串列表的正文
tagsarray 数组该列表中所有的标签
linenumber 数字该列表所在行
lineCountnumber 数字次列表占用的行数
listnumber 数字该组列表的起始行
outlinkslink 链接该列表的外链
pathstring 字符串列表所处的文件的路径
childrenarray 数组列表的子列表和子列表的子列表
taskboolean 布尔类型判断该列表是不是一个任务,值为 true 时是任务
annotatedboolean 布尔类型判断该列表是否包含元数据
positionobject 对象包含了这组列表的位置的起始信息
subtasksobject 对象列表的子列表和子列表的子列表(与 children 一致)
realboolean 布尔类型判断该列表是不是一个任务,值为 true 时是任务(与 task 一致)
headerlink 链接该列表上方最近的可链接的标题(与 link 和 section 一致)
位置 position

位置属性的数据类型是对象,它的子属性有 startend,他们的数据类型都是 object 对象,分别代表记录了这个列表的起始位置。它们的子属性有 linecoloffset

  • position.start.lineposition.end.line 都代表该列表所在行(不是列表组);
  • position.start.col 代表第一个字符所在列,position.end.col 代表最后一个字符所在列;
  • position.start.offset 代表文件开头到列表第一个字符所含的字符数,position.end.offset 代表文件开头到列表最后一个字符所含的字符数;
子列表 subtasks 和 children

这两个属性结果一致,数据类型是 object 对象。他们的其他属性前面都出现过,只有一个新的属性 parent 还没出现过。parent 的数据类型是 number 数字,代表他们的上级所在行。

用简写语法 (Shorthand Syntax) 定义的五个属性

12 - 添加元数据至列表和任务 中我们提到,使用图标简写语法可以为列表或任务添加五个属性

属性名数据类型解释
duedate 时间截止日期
completiondate 时间完成日期
createddate 时间创建日期
startdate 时间开始日期
scheduleddate 时间预期完成日期

任务特有的属性

属性名数据类型解释
statusstring 字符串任务的语法中,方括号内的字符(一般完成为 x)
checkedboolean 布尔类型方括号内是否有非空格字符(不一定是 x)
completedboolean 布尔类型只有方括号内为 x 才为 true 
fullyCompletedboolean 布尔类型任务及其所有子任务是否完成

上面的属性中,有不少属性之间的含义是完全一样的,有的属性之间只有细微差别

由于 file.tasks 只比 file.lists 多了一些属性,下面只列举了 file.lists 的部分,可以把 lists 改为 tasks 即可得到 file.tasks 的对应属性。

完全相同的属性

  • file.pathfile.lists.path
  • linksectionheader
  • position.start.lineposition.end.line
  • file.lists.childrenfile.lists.subtasks
  • file.lists.taskfile.lists.real

相近但不相等的属性

  • file.etagsfile.tags
  • file.listsfile.tasks
  • file.lists.checkfile.lists.completedfile.lists.fullyCompleted

三、具体查看隐式字段

这里只给出简单的 Dataview 代码,现在还不理解没关系,对应上面看懂属性的含义,知道在做什么即可

查询文件自带的元数据的属性

用查询文件的创建时间和最后一次修改时间举例,上文我们已经说过他们对应的属性名是 file.ctimefile.mtime,中间用逗号分割。将下面的代码直接放在正文中即可。(你也可以自己试试查询别的属性)

```dataview
table file.ctime, file.mtime
where file = this.file
```

简单解释一下这两行代码在做什么,更具体的请看 21 - 查询类型23 - 操作符

  • 第一行是确定以表 table 的形式显示查询结果,以及查询文件的创建日期和最后一次修改时间;
  • 第二行是将搜索范围缩小到 this file,也就是这段代码所在的文件;

查询列表和任务的元数据

列表和任务是在 file 属性下的子属性 file.listsfile.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基本语法

讨论

若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。



反馈交流

其他渠道

版权声明