Dataview 支持的四种代码结构

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 提供的一些 函数 更好的进行查询。

提示

  1. Query Type 决定查询的输出格式,这是我们查询唯一的必需信息(甚至只有这个内容都可以);
  2. Dataview 对大小写不敏感,TABLE、table 和 Table 是一样的效果,看个人习惯选择即可。但引号内的内容区分大小写;
  3. 支持中文;
  4. 代码的结构并不是必须按照上面给的格式,你可以自行换行,比如把搜索的 Field 写在第二行,又或者当语句不长的时候全部写在一行都是可以的;
  5. 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 - 查询类型


反馈交流

版权声明