Dataview 支持的四种代码结构
Dataview 一共提供了四种查询的方式,本系列文章仅介绍前两种,后两者涉及到 JavaScript 需要单独介绍
- 行内 DQL 查询;
- 放在代码块中用 DQL 语法查询;
- 利用 JavaScript 进行行内查询;
- 利用 JavaScript 以及名为 dataviewjs 的代码块查询;
行内 DQL 语法结构
注意
使用这种查询时,需要在 Dataview 设置中打开 Enable Inline Queries 设置。
行内 DQL 需要写在行内代码中,适合小范围嵌入元数据使用;
- 以一个等于号开头,后面跟需要显示的元数据;
- 如果是本文件的元数据,用
this
指代。如果是别的文件的元数据,用那个文件的链接指代;
查询本文件的名字:
`= this.file.name`
你会发现,当你光标移动到别处时,他就会变成文件的名字。
查询别的文件的元数据:用链接代表那个文件(方括号内的 file 替换成目标文件的文件名)
`= [[file]].file.name`
小技巧:修改行内查询的前缀
你可以在 Dataviews 的设置下的“代码块设置”>“内联查询前缀”中将 = 更改为另一个前缀 (如 dv: 或~)
代码块中的 DQL 语法结构
从 01 - 简单示例 可以观察到,dataview 的代码主要分为四个部分:
- 确定结果展示的方式以及展示的内容;
- 确定搜索的范围;
- 确定搜索的条件;
- 对搜索结果进行调整;
用代码表示就是:
```dataview
<Query-Type> <Fields>
from <Source>
<Data-Command> <Expression>
<Data-Command> <Expression>
%% 注释:可以有很多个 <Data-Command> %%
```
这就是 Dataview 的 DQL 语法的最核心的代码结构,分为四个部分:
Query-Type 查询类型
一共有四种查询类型,LIST, TABLE, TASK, CALENDAR,选择不同的类型会获得不同的展示效果,详细解释
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 - 查询类型
反馈交流
微信群
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。