Dataview 支持的四种查询方式
Dataview 一共提供了四种查询的方式,后两者涉及到 JavaScript ,不在 Dataview 基础语法中介绍
查询方式 | 介绍 |
---|---|
DQL 行内查询 | 可以直接插入文章中,像 excel 中使用函数那样,可以实现级联,缺点是功能不完整 |
DQL 代码块查询 | Dataview 用的最多的查询方式 |
DVJS 行内查询 | 和 DQL 行内查询类似,但是功能更多,但是需要用 javascript |
DVJS 代码块查询 | 可以满足大部分要求 |
DQL 行内查询:无痕插入文中
注意
使用这种查询时,需要在 Dataview 设置中打开 Enable Inline Queries 设置。
行内 DQL 需要写在行内代码中,适合小范围嵌入元数据使用;
- 以一个等号开头,后面跟需要显示的元数据;
- 如果是当前文件的元数据,用
this
指代。如果是别的文件的元数据,用那个文件的链接指代;
查询本文件的名字:
`= this.file.name`
你会发现,在你光标移动到别处后,他就会变成文件的名字。
查询别的文件的元数据:用链接代表那个文件(方括号内的 file 替换成目标文件的文件名)
`= [[file]].file.name`
小技巧:修改行内查询的前缀
你可以在 Dataview 设置中的“代码块设置”>“内联查询前缀”中将 = 更改为另一个前缀 (如 dv: 或~)
DQL 代码块查询
从 01 - 简单示例 可以观察到,dataview 的代码主要分为四个部分:
- 确定结果展示的方式以及展示的内容;
- 确定搜索的范围;
- 确定搜索的条件;
- 对搜索结果进行调整;
他们一般会以下图方式排列,翻译成文字就是:按照什么查询类型从某个文件夹或者按照某个标签查询,通过操作符对查询结果做了一些操作后,展示查询字段
写成代码代码就是:
```dataview
<Query-Type> <Fields>
From <Source>
<Data-Command> <Expression>
<Data-Command> <Expression>
%% 注释:可以有很多个 <Data-Command> %%
```
比如举个例子:
- 按照表格的显示
- 检索文件夹 ” 日记/2023” 中的所有文件
- 满足创建日期距离今天不超过 30 天的文件
- 展示这些文件中的 ” 心情 ” 和 ” 天气 ” 元数据
```dataview
Table 心情, 天气
From "日记/2023"
Where date(today) - file.cday < 30
```
接下来具体讲讲这四个部分
Query-Type 查询类型
Dataview 一共提供了四种查询类型:LIST, TABLE, TASK, CALENDAR,选择不同的类型会获得不同的展示效果。查询类型也是一个完整的 DQL 查询所唯一需要的。
Fields 字段
我们想要展现的内容,内容为 表达式,不妨配合 字面常量 使用;
例如:如果想展示搜索到的文件的名字,可以写 table file.name
;
可以在 14 - 隐式字段 中查看文件自带的所有 Metadata 和他们的含义;
Source 查询域
即查询的范围,查询的内容来自于哪里。可以是标签(Tags)、文件夹(Folders)、某个特定的文件(Specific Files),又或是一个链接(Links);
例如:如果范围是含有某标签,可以写 from #标签
,可以在 33 - 操作符 中查看更具体的解释;
Data-Command 操作符
我们对查找到的内容做的操作(筛选,排序,成组,拆分,限制数量等),具体见 23 - 操作符。还可以配合 Dataview 提供的一些 函数 更好的进行查询。
提示
- Query Type 决定查询的输出格式,这是我们查询唯一的必需信息(甚至只有这个内容都可以);
- Dataview 对大小写不敏感,TABLE、table 和 Table 是一样的效果,看个人习惯选择即可。但引号内的内容区分大小写;
- 支持中文;
- 代码的结构并不是必须按照上面给的格式,你可以自行换行,比如把搜索的 Field 写在第二行,又或者当语句不长的时候全部写在一行都是可以的;
- DQL 查询从上到下逐行执行,你可以写很多个 Data-Command;
利用 JavaScript 进行行内查询
注意
使用这种查询时,需要在 Dataview 设置中打开 Enable Inline JavaScript Queries 设置。
此处仅给一个示例,具体请看其他相关文章
This page was last modified at `$= dv.current().file.mtime`.
这段代码使用了 JS 进行了行内查询,获取最后一次修改当前文件的时间。
DataviewJS
注意
使用这种查询时,需要在 Dataview 设置中打开 Enable JavaScript Queries 设置。
这里给出一段 [Blue-Topaz 示例库](PKM-er/Blue-topaz-example: Blue topaz themes example vault for Obsidian (github.com)) 主页中的一段代码,他会告诉你你使用 Obsidian 的天数,以及创建了笔记、标签和代办的个数
```dataviewjs
let ftMd = dv.pages("").file.sort(t => t.cday)[0]
let total = parseInt([new Date() - ftMd.ctime] / (60*60*24*1000))
let totalDays = "您已使用 ***Obsidian*** "+total+" 天,"
let nofold = '!"misc/templates"'
let allFile = dv.pages(nofold).file
let totalMd = "共创建 "+ allFile.length+" 篇笔记"
let totalTag = allFile.etags.distinct().length+" 个标签"
let totalTask = allFile.tasks.length+"个待办。 "
dv.paragraph(
totalDays + totalMd + "、" + totalTag + "、" + totalTask
)
```
接下来,我们开始学习 dataview 语法的 21 - 查询类型,或是返回 Dataview基本语法。
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。