Obsidian 插件:Dataview
名称 | 用途 |
---|---|
Dataview | 根据笔记文件的元数据(标签、创建时间等隐式字段及用户自定义的YAML特征数据等)来查找笔记,而非通过文章中具体内容来匹配关键字。 |
参考:https://blacksmithgu.github.io/obsidian-dataview/
Dataview 包括两部分功能:数据索引 和 数据查询(这里面的 “数据” 指文件的特征数据,而不是文章内容)。
Dataview 无法读取笔记库种的所有内容,只能访问特定的数据索引(如:tags、要点、任务,这类数据会自动被 Dataview 利用,这些称为 “隐式字段”)。你还可以通过 “字段”(fields)来加入其他数据,可以是在文件内容正文顶部以 YAML 格式给出,也可以在正文内容中以 “行内字段/内联字段” (关键字:: 值
)的形式给出。Dataview 同样会对这类数据进行索引,让你可以在查询时以这些数据为筛选依据。
这些你自定义的 key,实际上没有任何的特殊性,地位都是相同的,只是你对它们的名字不同,你可以自己创建任意的名字来使用。这些可作为 Dataview 查询依据的 “名字”(字段)都称作 “元数据”(Metadata)。
数据索引:元数据字段
所谓的元数据 “字段”,是指一对 key 和 value 的组合。字段的值有一个数据类型(123 就是数值;2023-01-01 就是日期)。
-
普通字段值:数字(123)、日期(2023-01-01)、字符串(“abcd”)
-
对象字段(注意换行后,是用空格来缩进,而不能用 tab,用 tab 识别不了。另外对象的”属性“的冒号后面也要记得留一个空格再写值):
-
person: status: "alive" sex: "male"
使用方式:
where person.status = alive
-
隐式字段
参考:https://blacksmithgu.github.io/obsidian-dataview/annotation/metadata-pages/
即便你没有明确讲任何元数据添加到笔记中,Dataview 也会为你提供大量的索引数据,这些自动提供的称作 “隐式字段”。
隐式字段名称 | 数据类型 | 描述 |
---|---|---|
file.name | 文本 | Obsidian 侧边栏中显示的文件名。 |
file.folder | 文本 | 此文件所属文件夹的路径。 |
file.path | 文本 | 完整的文件路径,包括文件名。 |
file.ext | 文本 | 文件类型的扩展名;一般来说md 。 |
file.link | 关联 | 文件的链接。 |
file.size | 数字 | 文件的大小(以字节为单位)。 |
file.ctime | 日期与时间 | 文件的创建日期。 |
file.cday | 日期 | 文件的创建日期。 |
file.mtime | 日期与时间 | 上次修改文件的日期。 |
file.mday | 日期 | 上次修改文件的日期。 |
file.tags | 列表 | 笔记中所有唯一标签的列表。子标签按每个级别细分,因此#Tag/1/A 将存储在列表中作为[#Tag, #Tag/1, #Tag/1/A] . |
file.etags | 列表 | 注释中所有显式标签的列表;不像file.tags , 不会分解子标签,即[#Tag/1/A] |
file.inlinks | 列表 | 此文件的所有传入链接的列表,表示包含此文件链接的所有文件。 |
file.outlinks | 列表 | 此文件的所有传出链接的列表,表示文件包含的所有链接。 |
file.aliases | 列表 | 通过 YAML frontmatter 定义的注释的所有别名列表。 |
file.tasks | 列表 | ` |
file.lists | 列表 | 文件中所有列表元素的列表(包括任务);这些元素实际上是任务,可以在任务视图中呈现。 |
file.frontmatter | 列表 | 以`key |
file.day | 日期 | 仅当文件的文件名中包含日期(形式yyyy-mm-dd 或yyyymmdd )或包含Date 字段/内联字段时才可用。 |
file.starred | 布尔值 | 如果此文件已通过 Obsidian Core 插件“星标文件”加星标。 |
显式字段
这类字段由你明确地在笔记中给出。有两种方式:YAML Frontmatter 与 行内字段
-
YAML Frontmatter
Frontmatter 是一种常见的 Markdown 扩展,它允许将 YAML 元数据添加到页面顶部。它由 Obsidian 原生支持。
简单地说,就是在笔记文章的最上方,以 YAML 格式写入字段。
在文件正文顶部给出:(注意冒号之后要留一个空格再写值)
--- author: "Bill Gates" published: 2003 tags: poems --- # 标题 这里开始正文内容...
-
行内字段
行内字段形式给出:(注意冒号后要留一个空格再写值,另外只需要满足
key:: values
这种形式,并不需要外面一定带有括号,但如果这行除了key:: values
外其前或其后还有其他内容,则需要给key:: 加上英文字符的括号,中括号/小括号
)#poems (注意这里井号后没有留空格,所以不是标题,而是标签) # 标题 已经开始正文内容... From [author:: Bill Gates], written in (published:: 2003)
查询语法:
```dataview list from #peoms where author = "Bill Gates" ```
注意
Bill Gates
作为字符串,要写全,并且外面得用英文字符的双引号引起来,而不能是:author = "Bill"
或author = "Gates"
或author = Bill Gates
。而如果是以published:: 2003
为筛选依据,则这种纯数字为值的字段,查询的时候反而是不能加双引号的而是像如下的形式即可:```dataview list from #peoms where published = 2003 ```
注意对于标签如下:
--- tags: wow --- 正文开始 #hello
实际上 Dataview 并不能以
hello
为搜索依据,而只能以wow
为搜索依据,因为不以 YAML 格式来书写标签,对于 Dataview 来说仅仅是一个段落,没有元数据字段,所以也没有 Dataview 的自动索引(需要用顶部 YAML 格式),也就是不是 Dataview 索引的一部分,因此无法查询它。```dataview list from #wow where tags = "hello" ``` 是查询不到的 ```dataview list from #hello where tags = "wow" ``` 则可以被查询到。
数据查询
注意:不管你怎么编写 dataview 代码,都只是展示搜索文件而已,并不会对被搜索的文件进行修改。
格式:关键字大小写均可(但查询的内容默认是区分大小写的)。第一行必须有,其他行可有可无,但如果只有第一行,那么还是要在第二行中加入空行,才表明第一行已经结束;
```dataview
第一行:最终搜索结果用什么方式展示(list用列表形式列出符合条件的所有文件、table用表格形式列出符合条件的所有文件、task列出符合条件的所有任务);
from xxx (标签:#abc 、文件夹:"folder1"要有英文双引号),指明从哪里搜索(搜索范围),这行可有可无(不加范围就是从这个资料库中搜索);
第三行:各种命令用于过滤(where)、分组(group)、排序(sort)你的结果,这行可有可无。
```
```dataview
<QUERY-TYPE> <fields>
FROM <source>
<DATA-COMMAND> <expression>
<DATA-COMMAND> <expression>
...
```
展示方式
- list:用列表来展示
列出所有包含 #poems 标签且有一个 author 字段且 author 字段值为 "Bill Gates" 的所有文件。
```dataview
list
from #poems
where author = "Bill Gates"
```
- table:用表格来展示
table 是以表格形式列出搜索结果,第一行 table 后面要跟想要展示的表头,其中第一列固定为文件名,只需要写第二列到最后一列的表头,表头字段可以用 “as” 来重命名。
搜索所有带有 #poems 标签的文件,用表格形式展示,表头为:file、author、published、Metion(文件入链)
```dataview
table author,published,file.inlinks as "Metion"
from #poems
```
file | author | published | Metion |
---|---|---|---|
你还可以用函数来操作你的搜索结果,比如
date(now).year 返回当前年份
length(file.inlinks) 返回文件入链数
```dataview
TABLE author, date(now).year - published AS "Age in Yrs", length(file.inlinks) AS "Counts of Mentions"
FROM #poems
```
file | author | Age in Yrs | Count of Metions |
---|---|---|---|
更多函数,参考:https://blacksmithgu.github.io/obsidian-dataview/reference/functions/
建议了解 Dataview 的基础功能使用之后直接使用,当有特定需求,直接用已学会的方式实现,实在实现不了再去看文档学习如何去实现,而不是一开始就通读 Dataview 的所有帮助文档。
- task:列出所有任务(完成或未完成的)
```dataview
task
```
- calendar:用日历视图来展示
展示一个日历,在日历中,根据笔记库中的文件的创建日期,在日历中标上“点”。
```dataview
calendar file.cday
```
搜索来源(搜索范围)
标签:from #abc
文件夹(及其子文件夹):from "path/to/folder1"
(要用英文字符的双引号引起来,要有笔记库到该文件夹名的完整路径,而不是只给出文件名,另外最终的文件夹名后不能加斜杠,否则无法识别为文件夹)
单个文件:from "path/to/file"
(如果你的文件和文件夹的路径完全相同,Dataview 会优先选择文件夹,此时你可以通过指定扩展名强制 Dataview 从文件中读取:"path/to/file.md"
)
链接:
- 指向这个文件的所有链接:
from [[文件1]]
- 这个文件所有的出链:
from outgoing([[文件1]])
合并:
你可以组合这些搜索范围。
-
and
同时满足,如:from "path/to/folder1" and #abc
在 folder1 文件夹中且带有 #abc 标签 -
or
满足其一即可,如:from "path/to/folder1" or #abc
在 folder1 文件夹中或带有 #abc 标签(带有 #abc 标签的可以不在 folder1 文件夹中)from [[文件1]] or outgoing([[文件1]])
文件1 的所有入链和出链
-
还可以是组合,如:
-
#tag and ("folder" or #other-tag)
-
(#tag1 or #tag2) and (#tag3 or #tag4)
-
各种命令
-
筛选条件:
where
-
LIST WHERE file.mtime >= date(today) - dur(1 day)
获取最近 24 小时内修改过的所有文件; -
LIST FROM #projects WHERE !completed AND file.ctime <= date(today) - dur(1 month) (dur是时长函数,表示一段时间跨度)
查找所有未标记为完成且超过一个月的项目。
-
-
排序:
sort
按一个或多个字段对所有结果进行排序sort date [ascending/descending/asc/desc]
(方括号中的排序顺序可供选择)按日期进行排序;sort field1 [ascending/descending/asc/desc], field2 [ascending/descending/asc/desc]
根据多个字段进行排序,先按第一个字段排序,在此基础上,按第二个字段排序,如此类推。比如说第一个字段是日期,第二个字段是时分秒的时间,则日期可能是相同的,因此第一个字段排完之后,有很多结果因为日期是相同的,所以需要用更精确的要求(时分秒)继续排序。
-
限制:
limit
(通常与排序配合使用,比如显示排在前面的若干个结果)limit 5
只展示 5 个结果。
字面值
形式 | 含义 |
---|---|
0 | 数字0 |
123 | 正数123 |
-123 | 负数-123 |
“abc” | 字符串 “abc” |
[[文件1]] | 指向 “文件1” 的链接(“文件1” 的入链) |
[[]] | 当前文件链接 |
date(2021-07-14) | 日期:2021-07-14 |
dur(2 days 4 hours) | 持续时间:2 天 4 小时 |
[1,2,3] | 数字1,2,3 的列表 |
[[1,2],[3,4]] | 列表 [1,2] 和 [3,4] 的列表 |
{a:1,b:2} | 具有键 a 和 b 的对象,而 a 的值为 1,b 为 2。 |
日期 date()
表达式 | 含义 |
---|---|
date(2021-11-11) | 日期 2021 年 11 月 11 日 |
date(2021-09-20T20:17) | 日期 2021-09-20 20:17 |
date(now) | 当前日期和时间 |
date(today) | 当前日期 |
date(tomorrow) | 明天日期 |
date(yesterday) | 昨天日期 |
date(sow) | 本周开始日期 |
date(eow) | 当前一周结束日期 |
date(som) | 当月开始日期 |
date(eom) | 当月月底日期 |
date(soy) | 当年开始日期 |
date(eoy) | 当年年底日期 |
持续时间 dur()
表达式 | 含义 |
---|---|
dur(1 s);dur(1 sec);dur(1 second) | 1 秒 |
dur(3 s);dur(3 secs);dur(3 seconds) | 3 秒 |
dur(1 m);dur(1 min);dur(1 minute) | 1 分钟 |
dur(3 m);dur(3 mins);dur(3 minutes) | 3 分钟 |
dur(1 h);dur(1 hr);dur(1 hour) | 1 小时 |
dur(3 h);dur(3 hrs);dur(3 hours) | 3 小时 |
dur(1 d);dur(1 day) | 1 天 |
dur(3 d);dur(3 days) | 3 天 |
dur(1 w);dur(1 wk);dur(1 week) | 1 周 |
dur(3 w);dur(3 wks);dur(3 weeks) | 3 周 |
dur(1 mo);dur(1 month) | 1 个月 |
dur(3 mo);dur(3 months) | 3 个月 |
dur(1 yr);dur(1 year) | 1 年 |
dur(3 yrs);dur(3 years) | 3 年 |
组合
表达式 | 含义 |
---|---|
dur(1 s, 2 m, 3 h) | 3小时2分1秒 |
dur(1 s 2 m 3 h) | 3小时2分1秒 |
dur(1s 2m 3h) | 3小时2分1秒 |
dur(1second 2min 3h) | 3小时2分1秒 |