Dataview 提供的四种查询类型

Dataview 提供的四种查询类型

  • 查询类型决定了数据视图查询的输出是什么样子,也是 DQL 查询的唯一的强制性规范
  • 查询类型还决定在哪个信息级别上执行查询。LIST、TABLE 和 CALENDAR 在页级操作,而 TASK 查询在文件级操作。

Dataview 提供了四种内置查询类型:

提示

Dataview 中的命令对大小写不敏感,因此 List 和 LIST 是一样的效果

下面给出四种查询类型的简单使用方法,以及进阶使用的相关示例链接

LIST 列表

LIST 查询时,会将结果组成一个无序列表,包含文件链接或组名 (如果决定分组)。除了文件信息外,最多还可以指定一个要输出的附加信息。

如果只有一个简单的 LIST 而没有其他的约束条件,他就会把库中的所有的文件以列表的形式展现出来(只有 Query Types 且不包含其他任何信息的时候,需要在结尾加一个空格);

```dataview
LIST 
```

结果:

Dataview 提供的四种查询类型--LIST 列表

现在,我们可以试着加入一些约束条件(Data Commands)和展示的域

配合 Filed 使用

Filed 需要填写的是 元数据(Metadata) 或者他们组成的 表达式

使用 List 查询时,Field 只能有一个属性。

例子:让结果显示文件来自于哪个文件夹

(如果你的 Vault 有很多文件,建议在后面加一行 limit n,n 是展示的条数,自己选择即可)

```dataview
LIST file.folder
LIMIT 10
```

结果:

Dataview 提供的四种查询类型--配合 Filed 使用

用 WITHOUT 去除第一个属性

一般 List 查询会展示文件的链接以及一个 Field 附加的属性,如果不想要展示文件的链接,我们可以在 list 后面加上 without id,再后面继续跟上需要的 Field 即可(如果不写属性的话还是会显示文件的链接)

```dataview
LIST WITHOUT ID file.path
```

结果:

Dataview 提供的四种查询类型--用 WITHOUT 去除第一个属性

TABLE 表格

TABLE 查询类型将页面数据输出为表格视图

  • 可以用逗号分隔来同时查询多个属性;
  • 可以使用纯元数据字段作为列,还可以指定计算;
  • 与所有其他查询类型一样,你可以配合其他函数来优化查询的结果;

同时查询多个属性

例子:显示含有 PKMER 标签的文件,并且展示文件的路径以及所有标签;

```dataview
TABLE file.folder, file.etags
FROM #PKMER
```

结果:

Dataview 提供的四种查询类型--同时查询多个属性

用 WITHOUT 去除第一列

和 List 一样,都是直接在 table 后加上 without id 即可,但是需要有别的属性(不然会显示空白)。

示例:去除第一列,并展示含有 book 标签的文件的名字以及创建时间 file.ctime(限制十个)

  • file.name 和 file.ctime 可以和 WITHOUT ID 隔一个空格,也可以换行;
  • WIHOUT ID 也不区分大小写,写成 Table without id 也可以;
```dataview
TABLE WITHOUT ID 
file.name, file.ctime
FROM #book
limit 10
```

然后我们来说说这个第一列,对于没有使用 Group by 成组操作符的 DQL 代码,第一列应该是文件的链接。而如果使用了成组操作符的代码,第一列就会变成成组条件。

列的名字可以在设置中修改,TABLE 默认显示的第一列的名字默认是 “File” 和文件数量,成组默认显示的是 “Group”;

Dataview 提供的四种查询类型--用 WITHOUT 去除第一列

对纯元数据进行计算

我们之前给出的查询,得到的结果都是文件。这里的纯元数据是指属性只有属性值,而不属于某个文件的元数据。看下面这个例子

```dataview
Table without id 2 + 3
Limit 1
```

Dataview 提供的四种查询类型--对纯元数据进行计算

会发现 Dataview 是可以计算并给出结果的。

我们还可以对字符串做一些操作,比如用 + 实现对字符串的拼接

```dataview
table without id ("string1" + "string2") as "字符串拼接"
limit 1
```

Dataview 提供的四种查询类型--对纯元数据进行计算

最重要的是,我们可以把纯元数据和文件的元数据搭配使用,达到自定义格式的效果。

如果我们想给查询到的结果添加下划线

```dataview
table ("<u>" + file.name + "</u>") as "Name"
limit 5
```

Dataview 提供的四种查询类型--对纯元数据进行计算

这里使用的 as 可以为查询的结果的列名重命名,具体见 22 - 查询字段;

TASK 任务

TASK 查询将库中符合给定条件 (如果有的话) 的所有任务生成一个交互式列表。TASK 查询与其他查询类型相比是特殊的,因为它们返回的结果是任务,而不是页面。这意味着所有数据命令都在任务级别上操作,并且可以对任务进行细粒度过滤。(即筛选最小的范围从页面级到了任务级,可以根据任务本身的元数据进行过滤)

只用 TASK 时,他会显示所有文档中的所有任务(注意末尾加空格)

```dataview
TASK 
```

现在,我们可以试着加入一些约束条件(Data Commands)

  • 配合 WHERE 操作符:

例子:搜索所有未完成的并含有 shopping 标签的任务

TASK 
WHERE !completed AND contains(tags, "#shopping") 

结果:

Dataview 提供的四种查询类型--TASK 任务

一个非常常用例子:搜索所有未完成的任务,并且按他们的原始文件分类

ps.可以复制到你的文件中,但是注意如果你有太多未完成的任务,建议在末尾加一行 LIMIT n

```dataview
TASK 
WHERE !completed 
GROUP BY file.link 
```

结果如下,可以看到列出了三天没有完成的 4 个任务,并且按照日期分了组:

Dataview 提供的四种查询类型--TASK 任务

注意

  • 其中每个标题括号后面的数字,代表与他们相邻的下一级的任务的数量,经测试目前最新版 0.5.64 已经修改为数字代表任务及其所有子任务的总数量。(感谢群友 @秋暖 的指正)
  • 只要父任务满足约束条件(例如未完成),那么父任务以及他的所有子任务(包括不符合约束条件的)都会被筛选出来。
  • 但是如果是子任务满足约束条件,但是父任务不满足约束条件,那么只会单独显示子任务。

想要了解更复杂的 TABLE 使用方法吗?可以看看:

CALENDAR 日历

  • CALENDAR 查询输出一个月的日历,其中每个结果都用一个点表示在对应的日期上。
  • CALENDAR 是唯一需要附加信息的查询类型,并且附加信息需要是日期。
```dataview
CALENDAR file.ctime 
```

Dataview 提供的四种查询类型--CALENDAR 日历

其中,里面某一天里面的每一个点就代表一个查询结果(文件),光标移动到点出就可以预览对应的文件。文件分布在哪一天是由代码中的 file.ctime 决定的;

虽然可以将 SORT 和 GROUP BY 与 CALENDAR 结合使用不会报错,但是也不会有效果。

此外,如果给定的元数据字段包含有效日期以外的内容 (但该字段可以为空),则不会呈现日历查询。为了确保你只考虑有效的页面,你可以过滤有效的元数据值:

```dataview
CALENDAR due 
WHERE typeof(due) = "date" 
```

接下来,我们开始学习 dataview 语法的 22 - 查询字段,或是返回 Dataview基本语法

讨论

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



反馈交流

其他渠道

版权声明