Dataview 支持的四种查询方式

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 支持的四种查询方式--DQL 代码块查询

写成代码代码就是:

```dataview
<Query-Type> <Fields> 
From <Source> 
<Data-Command> <Expression> 
<Data-Command> <Expression> 

%% 注释:可以有很多个 <Data-Command> %%
```

比如举个例子:

  1. 按照表格的显示
  2. 检索文件夹 ” 日记/2023” 中的所有文件
  3. 满足创建日期距离今天不超过 30 天的文件
  4. 展示这些文件中的 ” 心情 ” 和 ” 天气 ” 元数据
```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 提供的一些 函数 更好的进行查询。

提示

  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 - 查询类型,或是返回 Dataview基本语法

讨论

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



反馈交流

其他渠道

版权声明