Dataview 提供的四种查询类型
- 查询类型决定了数据视图查询的输出是什么样子,也是 DQL 查询的唯一的强制性规范。
- 查询类型还决定在哪个信息级别上执行查询。LIST、TABLE 和 CALENDAR 在页级操作,而 TASK 查询在文件级操作。
Dataview 提供了四种内置查询类型:
提示
Dataview 中的命令对大小写不敏感,因此 List 和 LIST 是一样的效果
下面给出四种查询类型的简单使用方法,以及进阶使用的相关示例链接
LIST 列表
LIST 查询时,会将结果组成一个无序列表,包含文件链接或组名 (如果决定分组)。除了文件信息外,最多还可以指定一个要输出的附加信息。
如果只有一个简单的 LIST 而没有其他的约束条件,他就会把库中的所有的文件以列表的形式展现出来(只有 Query Types 且不包含其他任何信息的时候,需要在结尾加一个空格);
```dataview
LIST
```
结果:
现在,我们可以试着加入一些约束条件(Data Commands)和展示的域
配合 Filed 使用
Filed 需要填写的是 元数据(Metadata) 或者他们组成的 表达式。
使用 List 查询时,Field 只能有一个属性。
例子:让结果显示文件来自于哪个文件夹
(如果你的 Vault 有很多文件,建议在后面加一行 limit n,n 是展示的条数,自己选择即可)
```dataview
LIST file.folder
LIMIT 10
```
结果:
用 WITHOUT 去除第一个属性
一般 List 查询会展示文件的链接以及一个 Field 附加的属性,如果不想要展示文件的链接,我们可以在 list
后面加上 without id
,再后面继续跟上需要的 Field 即可(如果不写属性的话还是会显示文件的链接)
```dataview
LIST WITHOUT ID file.path
```
结果:
TABLE 表格
TABLE 查询类型将页面数据输出为表格视图。
- 可以用逗号分隔来同时查询多个属性;
- 可以使用纯元数据字段作为列,还可以指定计算;
- 与所有其他查询类型一样,你可以配合其他函数来优化查询的结果;
同时查询多个属性
例子:显示含有 PKMER 标签的文件,并且展示文件的路径以及所有标签;
```dataview
TABLE file.folder, file.etags
FROM #PKMER
```
结果:
用 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
Table without id 2 + 3
Limit 1
```
会发现 Dataview 是可以计算并给出结果的。
我们还可以对字符串做一些操作,比如用 +
实现对字符串的拼接
```dataview
table without id ("string1" + "string2") as "字符串拼接"
limit 1
```
最重要的是,我们可以把纯元数据和文件的元数据搭配使用,达到自定义格式的效果。
如果我们想给查询到的结果添加下划线
```dataview
table ("<u>" + file.name + "</u>") as "Name"
limit 5
```
这里使用的 as
可以为查询的结果的列名重命名,具体见 22 - 查询字段;
TASK 任务
TASK 查询将库中符合给定条件 (如果有的话) 的所有任务生成一个交互式列表。TASK 查询与其他查询类型相比是特殊的,因为它们返回的结果是任务,而不是页面。这意味着所有数据命令都在任务级别上操作,并且可以对任务进行细粒度过滤。(即筛选最小的范围从页面级到了任务级,可以根据任务本身的元数据进行过滤)
只用 TASK 时,他会显示所有文档中的所有任务(注意末尾加空格)
```dataview
TASK
```
现在,我们可以试着加入一些约束条件(Data Commands)
- 配合 WHERE 操作符:
例子:搜索所有未完成的并含有 shopping 标签的任务
TASK
WHERE !completed AND contains(tags, "#shopping")
结果:
一个非常常用例子:搜索所有未完成的任务,并且按他们的原始文件分类
ps.可以复制到你的文件中,但是注意如果你有太多未完成的任务,建议在末尾加一行 LIMIT n
```dataview
TASK
WHERE !completed
GROUP BY file.link
```
结果如下,可以看到列出了三天没有完成的 4 个任务,并且按照日期分了组:
注意
- 其中每个标题括号后面的数字,代表与他们相邻的下一级的任务的数量,经测试目前最新版 0.5.64 已经修改为数字代表任务及其所有子任务的总数量。(感谢群友 @秋暖 的指正)
- 只要父任务满足约束条件(例如未完成),那么父任务以及他的所有子任务(包括不符合约束条件的)都会被筛选出来。
- 但是如果是子任务满足约束条件,但是父任务不满足约束条件,那么只会单独显示子任务。
想要了解更复杂的 TABLE 使用方法吗?可以看看:
CALENDAR 日历
- CALENDAR 查询输出一个月的日历,其中每个结果都用一个点表示在对应的日期上。
- CALENDAR 是唯一需要附加信息的查询类型,并且附加信息需要是日期。
```dataview
CALENDAR file.ctime
```
其中,里面某一天里面的每一个点就代表一个查询结果(文件),光标移动到点出就可以预览对应的文件。文件分布在哪一天是由代码中的 file.ctime
决定的;
虽然可以将 SORT 和 GROUP BY 与 CALENDAR 结合使用不会报错,但是也不会有效果。
此外,如果给定的元数据字段包含有效日期以外的内容 (但该字段可以为空),则不会呈现日历查询。为了确保你只考虑有效的页面,你可以过滤有效的元数据值:
```dataview
CALENDAR due
WHERE typeof(due) = "date"
```
接下来,我们开始学习 dataview 语法的 22 - 查询字段,或是返回 Dataview基本语法。
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。