Dataview进阶 —— 基础字段

这篇文章是 Dataview专栏 系列 0 篇文章中的第 [part not set]

dataview

查询语句语法含义

知其然也知其所以然,所谓查询的语句是很简单的东西,只要符合规范就不会错。

[!info] 相关信息
Dataview 是一种简化版的 SQL 查询语句,Dataview Query Language (DQL),所以他们也符合一定的规范,如果你刚好了解一些SQL的知识,这将很容易理解。

[!warnning] 先从学会改动开通
- 建议不要看过于复杂的代码,也不要急于实现太复杂的效果
- 花几分钟就能熟悉,先要知道改哪里就够了。

  1. 完整的查询语法
    无论 dataview 也好,dataviewjs 也罢,都必须遵循一个逻辑流程:

image.png|900|900

这个是一个典型的 dataview 的查询语句,你只要复制,格式上就不会错误。

```dataview
list
from "obsidian" and #obsidian
sort file.ctime desc
```
</code></pre>

<ul>
<li>第1行:是固定格式,不用动,用三个点开始,表示代码块的语言是<code>dataview</code></li>
<li>第5行:也是固定格式,不用动。表示代码块的结束。我们用三个点开始,在用三个点结束</li>
<li>第2行:list,表示呈现的样式,有4种,table、list、task、CALENDAR。按需选择,大小写无所谓</li>
<li>第3行:from,字面意思,就是从哪里查询。比如从指定的文件夹,标签、文件等</li>
<li>第4行:sort,字面意思排序,按<code>file.ctime</code>这个字段,desc排序方式。</li>
<li>其他规范:英文单词之间用<strong>一个空格间隔</strong>,每行一个语句,<strong>标点符号一定要用英文符号</strong></li>
</ul>

<strong>经常改动哪里?</strong>

<ul>
<li>from:指定查询的地方,

<ul>
<li>如果是文件夹,格式固定为 <code>"文件夹"</code>,英文双引号里面是文件夹名字,双引号一定要有。</li>
<li>如果是标签,格式固定为<code>#标签名</code>,英文的<code>#</code>号加上标签名字,英文的<code>#</code>号一定要有。</li>
<li>如果同时查询两个条件,可以用<code>and</code>连接起来,表示同时具备。</li>
<li>如果从两个条件中任一匹配一个,可以用<code>or</code>连接起来,表示或者,选择其中一个。</li>
</ul></li>
<li>sort:排序

<ul>
<li>可替换<code>file.ctime</code>文件创建时间这里,<code>file.mtime</code>文件修改时间,<code>file.name</code>文件名。其他复杂的以后在研究。(了解一下,这个file.ctime叫做隐式字段)</li>
<li>排序方式两种,<code>DESC</code>降序排列和<code>ASC</code>升序排列,</li>
</ul></li>
</ul>

<h2>查询结果显示样式</h2>

查询结果可以有四种样式:

<ol>
<li><strong>TABLE</strong>: 表格样式,传统的视图类型;每个数据点有一行,有几列的字段数据.</li>
<li><strong>LIST</strong>: 列表样式,匹配查询的页面的列表。你可以为每个页面输出一个单一的关联值.</li>
<li><strong>TASK</strong>: 任务列表,页面符合给定查询的任务列表.</li>
<li><strong>CALENDAR</strong>: 一个日历视图,通过其相关日期上的一个点来显示每一个命中率。</li>
</ol>

<h2>可供查询的字段</h2>

既然是查询,那肯定需要指定查询的条件,就是这里的字段。主要是两种:

<ul>
<li>自带<code>隐式字段</code>,由 dataview 自动添加给md文件,</li>
<li>添加的自定义字段,可在页面顶部和正文自行添加。然后去调用。比如<code>书名:: obsidian文档</code>,通过查询<code>书名</code>,可以得到<code>obsidian文档</code>这个值
> [!info] 提示
> 我们通过查询这两种字段,达到对文件查询的目的。理解了概念,其实用起来就简单了。</li>
</ul>

<img src="https://raw.githubusercontent.com/YiDaCP/Pictures/main/2024/05/12/adc1760dc5475b2cdaa9ddc60c35adf0-adc1760dc5475b2cdaa9ddc60c35adf0-20240512061142-262fbc-e39217.png" alt="image.png|900|900" />

<h3>隐式字段</h3>

<blockquote>
  [!tip] 隐式字段是什么?
  是dataview自动为md文件插入的字段,是为了增加更多的查询项目。掌握了隐式字段,也能够熟练的使用dataview的查询条件了,主要是两种:
  - 一是页面文件的隐式字段
  - 二是task和list的隐式字段

  [!info] 隐式字段是查询条件
  可以通过查询隐式字段,查询md文件的更多属性,比如创建时间、文件标题、修改时间等等。

  [!danger] 不要慌张
  我们不必要记住这么多,只需要知道有这么个东西。需要的时候查询[[Obsidian进阶 —— 初识Dataview]]即可。<br />
  所以收藏本文档,防走失!
</blockquote>

<h3>file.文件隐式字段</h3>

<ul>
<li><code>file.name</code>: 文件标题(一个字符串).</li>
<li><code>file.folder</code>: 这个文件所属的文件夹的路径.</li>
<li><code>file.path</code>: 完整的文件路径(一个字符串).</li>
<li><code>file.ext</code>: 文件类型的扩展名;一般为&#039;.md&#039;(字符串).</li>
<li><code>file.link</code>: 通往该文件的链接(一个链接)</li>
<li><code>file.size</code>: 文件的大小(以字节为单位)(一个数字).</li>
<li><code>file.ctime</code>: 该文件的创建日期(一个日期+时间)</li>
<li><code>file.cday</code>: 文件创建的日期(只是一个日期).</li>
<li><code>file.mtime</code>: 文件最后被修改的日期(一个日期+时间)。.</li>
<li><code>file.mday</code>: 文件最后被修改的日期(只是一个日期)。.</li>
<li><code>file.tags</code>: 笔记中所有独特标签的一个数组. 小标签按每个级别进行细分, so <code>#Tag/1/A</code> 将被存储在数组中,作为 <code>[#Tag, #Tag/1, #Tag/1/A]</code>.</li>
<li><code>file.etags</code>: 注释中所有显式标签的数组; unlike <code>file.tags</code>, 不包括子标签.</li>
<li><code>file.inlinks</code>: 该文件的所有传入链接的数组.</li>
<li><code>file.outlinks</code>: 该文件中所有外链的数组.</li>
<li><code>file.aliases</code>: 笔记中所有别名的一个数组.</li>
<li><code>file.tasks</code>: 一个包含所有任务的数组 (I.e., <code>- [ ] blah blah blah</code>) 在这个文件中。</li>
<li><code>file.lists</code>: 文件中所有列表元素的数组(包括任务);这些元素是有效的任务,可以在任务视图中呈现。.</li>
<li><code>file.frontmatter</code>: 包含所有frontmatter的原始值;主要用于检查frontmatter的原始值或动态地列出前题的 keys 键值(字段)。</li>
</ul>

如果文件的标题内有一个日期(形式为 <code>yyyy-mm-dd</code> 或 <code>yyyymmdd</code>),或有一个Date字段/inline字段,它也有以下属性。

<ul>
<li><code>file.day</code>: 与文件标题相关的明确日期. 如果你使用obsidian核心插件 "Starred Files",以下元数据也是可用的。</li>
<li><code>file.starred</code>: 如果这个文件已经被 "stars " obsidian插件加了星号。</li>
</ul>

<h3>task.待办隐式字段</h3>

<ul>
<li><code>status</code>: 该任务的完成状态,由<code>[]</code>括号内的字符决定。一般来说,空格<code>" "</code>表示未完成的任务,X<code>"X"</code>表示完成的任务,但允许支持其他任务状态的插件。</li>
<li><code>checked</code>: 该任务是否以任何方式被检查过(即它的状态不是未完成/空的)。.</li>
<li><code>completed</code>: 这个<em>具体的</em>任务是否已经完成;这不考虑任何子任务的完成/未完成情况。如果一项任务被标记为 "X",则明确视为 "完成"。.</li>
<li><code>fullyCompleted</code>: Whether or not this task and <strong>all</strong> of its subtasks are completed.</li>
<li><code>text</code>: 这项任务的文本.</li>
<li><code>line</code>: 该任务显示的行.</li>
<li><code>lineCount</code>: 这项任务所占的 markdown 行数.</li>
<li><code>path</code>: 该任务所在文件的完整路径.</li>
<li><code>section</code>: 该任务包含的章节链接.</li>
<li><code>tags</code>: 文本任务内的任何标签。</li>
<li><code>outlinks</code>: 本任务中定义的任何链接.</li>
<li><code>link</code>: 通往该任务附近最近的可链接区块的链接;对于建立通往该任务的链接很有用。.</li>
<li><code>children</code>: 该任务的任何子任务或子清单.</li>
<li><code>task</code>: 如果为真,这是一个任务;否则,它是一个普通的列表元素.</li>
<li><code>completion</code>: 一项任务完成的日期; set by <code>completion...</code> or <a class="wp-editor-md-post-content-link" href="https://blacksmithgu.github.io/obsidian-dataview/annotation/metadata-tasks/#field-shorthands">shorthand syntaxopen in new window</a>.</li>
<li><code>due</code>: 任务到期的日期,如果它有一个。. Set by <code>due...</code> or <a class="wp-editor-md-post-content-link" href="https://blacksmithgu.github.io/obsidian-dataview/annotation/metadata-tasks/#field-shorthands">shorthand syntaxopen in new window</a>.</li>
<li><code>created</code>: 一个任务的创建日期; set by <code>created...</code> or <a class="wp-editor-md-post-content-link" href="https://blacksmithgu.github.io/obsidian-dataview/annotation/metadata-tasks/#field-shorthands">shorthand syntaxopen in new window</a>.</li>
<li><code>start</code>: 一个任务可以开始的日期; set by <code>start...</code> or <a class="wp-editor-md-post-content-link" href="https://blacksmithgu.github.io/obsidian-dataview/annotation/metadata-tasks/#field-shorthands">shorthand syntaxopen in new window</a>.</li>
<li><code>scheduled</code>: The date a task is scheduled to work on; set by <code>scheduled...</code> or <a class="wp-editor-md-post-content-link" href="https://blacksmithgu.github.io/obsidian-dataview/annotation/metadata-tasks/#field-shorthands">shorthand syntaxopen in new window</a>.</li>
<li><code>annotated</code>: 如果任务有任何自定义注解,则为真,否则为假.</li>
<li><code>parent</code>: 这个任务上面的任务的行号,如果存在的话;如果这是一个根级任务,则为空。.</li>
<li><code>blockId</code>: 该任务/列表元素的块ID, if one has been defined with the <code>^blockId</code> syntax; otherwise null.</li>
</ul>

<h3>自定义Frontmatter前言</h3>

<blockquote>
  [!tips] Frontmatter 是什么
  Frontmatter 是一个常见的 Markdown 扩展,它允许将 YAML 元数据添加到页面顶部。 <strong>注意:他必须在页面的最顶部</strong>

  [!success] YAML是什么
  YAML 符合规范的一种数据格式,都是成对存在,<code>key: value</code> 键和值。通过查询键,可以得到对应的值。
</blockquote>

<ol>
<li>典型的frontmatter YAML定义:</li>
</ol>

<pre><code class="line-numbers">--- 
alias: "document" 
last-reviewed: 2021-08-17 
thoughts: 
    rating: 8 
    reviewable: false
---
</code></pre>

以上定义了几个字段,具体含义如下:
- <code>alias</code> 是一个文本,因为它被包装在“”中
- <code>last-reviewd</code> 是一个日期,因为它遵循 ISO 日期格式
- <code>thoughts</code> 是一个对象字段,因为它使用 YAML 前置对象语法,我们想查询 <code>thoughts.rating为8</code> 的结果,以列表样式显示:

<pre><code class="line-numbers">```dataview
list
where thoughts.rating = 8
```
`````

2. 定义 frontmatter YAML
```
---
别名:"文档"
最后审查:2024-5-12
想法:
    等级:8
    可审查:否
---
```
以上定义了几个字段,具体含义如下:
- 别名 是一个文本,因为它被包装在 "" 中
- 最后审查 是一个日期,因为它遵循 ISO 日期格式
- 想法 是一个对象字段,因为它使用了 YAML 前置对象语法,我们想查询 想法.等级为8 的结果,以列表样式显示:
list
where 想法.等级 = 8
> [!danger] 标点符号必须是英文
> - 特别注意,在查询和定义的时候,:"". 这些符号必须是英文符号
> - 单词之间用空格间隔

3. 自定义 inline 内联字段
就是可以在正文中插入的字段,也可以被 dataview 所查询。但是一般情况下,应该尽量避免使用,因为太零散了不容易管理。

key:: value
book:: obsidian

```
键:: 值
书名:: obsidian

</code></pre>

查询书名为obsidian的字段

<pre><code class="line-numbers">```dataview
LIST
WHERE 书名 = obsidian


小结:先定义字段再查询

除了 dataview 自动插入的隐式字段,其他的字段需要我们自定义

  • 页面顶部的 Frontmatter 字段是常见的方式
  • 页面正文的 内联字段 是辅助的定义方式

[!danger] 定义字段简单灵活
熟练的掌握 自定义字段 ,让我们的 obsidian 变成了一个小系统,实现仿数据库的查询效果可以结合 template 插件,很方便的生成固定格式的 Frontmatter YAML 模板也可以结合 quickadd 插件,让模板的生成更快捷也可以结合 button 插件,给这些动作加上一个漂亮方便的按键。让你的obsidian与众不同