Obsidian 0x05:Obsidian 插件:Dataview

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-ddyyyymmdd)或包含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
```
fileauthorpublishedMetion

你还可以用函数来操作你的搜索结果,比如

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
```
fileauthorAge in YrsCount 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秒
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值