Dataview 中的 Metadata 的数据类型

Dataview 中的 Metadata 的数据类型

Metadata 是一个键值对(Key - Value,在这里称 Field Name - Field)

Field Name 属性名

我们为文件添加元数据后,不一定会采用我们给定的格式,它会在内部(不会显示)自动对 Field Name 值进行一定修改,以保证格式统一。

  • Field Name 值自动修改规则
  • 如果有粗体、斜体等格式,格式会被擦除,变成普通文本;
  • 如果中间无空格,原本有大写的 Key 值和全部字母小写后的值都可以当作其 Key 值;
  • 如果中间有空格,会被替换成 -,并且所有大写字母会被换成小写字母;

举几个例子

原 Field Name 的写法修改后改动内容
**basic**basic去掉粗体
BasicBasic 或 basic (不能是 BaSic 之类)增加了小写
basic fieldbasic-field- 替换空格
**Bold Field**bold-key去掉粗体,并替换空格,同时全部小写

Field 属性域

属性域具有数据类型,也就是说,它能够区分数字、文字、时间类型等。不同的数据类型具有不同的信息,比如数字有可以量化的信息,文字有内容信息,时间有年月日信息,布尔类型有真假信息。有了不同的数据类型,我们才可以更高效且准确的进行查询,因此数据类型非常有必要存在。

string 字符串

默认的数据类型,也是最常用的数据类型。当一个 Field 没有对应的类型时,就为 string 类型(因此可以用双引号包含,也可以不用),常见的可以是,一个单词,一段话等。例如这个 43 - YAML 基础 中提供的例子,里面的属性:书名,author,country,abstract 的数据类型都是字符串。直接输入中文一般都是字符串;

number 数字类型

不区分整数还是小数,全部都为数字类型。

boolean 布尔类型

分为 true 和 false 两种,代表真和假;

例如这个 43 - YAML 基础 中提供的例子中的 finish 属性域就是 false,检索的时候就可以直接检索 finish 域为 true 或者 false 来分别查询所有阅读完了或者没读完的书目。文件默认的元数据 file.starred 的数据类型也是布尔类型,代表是否标星号。但是星标插件已经被 书签 插件取代,也许后面这个属性 file.starred 会改名;

date 时间类型

匹配 ISO8601表示法 的文本将自动转换为日期对象;

例如:2023-07-172023-07-17T16:34:0002021-08-13T14:20:18.992847200-04:00,能够包含年月日、时分秒、纳秒甚至时区的信息;

  • 从时间域 field 中提取信息
语法解释
field.year获取年份
field.month获取月份
field.weekyear获取周数(从每年的第一天开始算,一年约 52 周)
field.week获取周数(从每个月第一天,一月约 4 周)
field.weekday获取星期数(星期 1 为 1、星期 2 为 2)
field.day获取天数
field.hour获取小时数
field.minute获取分钟数
field.second获取秒数
field.millisecond获取纳秒数

duration 定长时间

Date 时间是指一个时间点,而 Duration 是指一段时间。比如 1 分钟、1 天、1 年等;

语法:

  • 时间长度 + 单位
  • 中间可以紧挨着,也可以空格分割,也可以逗号分割,还可以组合;
  • 时间长度是数字,单位单复数都行,有:
    • 秒:s、sec、secs、second、seconds;
    • 分钟:m、min、mins、minnute、minutes;
    • 小时:h、hr、hrs、hour、hours;
    • 天:d、day、days;
    • 周:w、wk、wks、week、weeks;
    • 月:mo、month、months;(注意和分钟区分)
    • 年:yr、yrs、year、years;(注意没有 y)

例子

  • 紧挨着:1min
  • 空格分割:3 day
  • 逗号分隔:2 min, 3 hours
  • 组合:1 second 2 min 3 h
  • 顺序无关紧要:2m1s3h 和上一个的结果一致

链接也是其中的一种数据结构,语法和在正文中的一致: [[链接]][[链接|显示的名字]]

示例:

  • 在文档属性:Linkto: [[...]]
  • 在行内字段中:Linkto:: ...

array 数组(List 列表)

多值属性的值域

添加在文档属性中有两种写法:

  • 如果是源码模式,有两种写法:
    • 第一种是以逗号分割,用方括号 [ ] 括起来;
    • 第二种是用无序列表;
---
tags: [obsidian, 插件, Dataview]
---

也可以写成

---
tags: 
  - obsidian
  - 插件
  - Dataview
---
  • 如果你是实时预览模式,你只需要在选择该属性为列表 List,每输入一个值点击回车确认即可

Dataview 中的 Metadata 的数据类型--array 数组(List 列表)

添加在行内字段中就直接用逗号分割,如 tags:: obsidian, 插件, Dataview

注意

一个列表中的所有属性的属性值都要相同,因此例如 example:: 值1, 值2, 3。这三个属性值的数据类型都是字符串,包括第三个属性值 “3”。

如果所有属性值都是数字,或者都是布尔值的时候,他们的数据类型才会是数字或者字符串。但凡有一个不是,dataview 会把他们都以字符串的格式识别。因此如果遇到你用列表中的数字加减发现报错,不妨用 typeof() 函数检查一下这个 ” 数字 ” 会不会其实是字符串。

object 对象

有的属性,没法用一个值来概括,而需要多个值来概括时,这个属性就是一个对象,我们把对象的一个个属性都作为属性域。(列表的多值属性是同一种含义,共享一个属性,对象的多个属性域有不同的含义,是属性的属性,如果有学过面向对象编程应该很熟悉)

语法:

--- 
obj: 
  key1: "Value" 
  key2: 3 
  key3: 
   - "List1" 
   - "List2" 
   - "List3" 
---

举个例子,比如文件为记录一部电影,属性可以有前奏和片尾曲这两个对象,他们可以有歌名和歌手的属性:

Prelude: 
  - name: ...
  - singer: ...
EndSong:
  - name: ...
  - singer: ...

这种写法只能在 Frontmatter 中使用,Inline Field 中无法使用;

从这里也能看出元数据对于查询有很大帮助。我们可以利用不同数据类型的元数据提供的信息,对文件进行检索,最终查询出符合我们给定的条件(比如作者来自中国需要用 from = 中国 来筛选)的所有结果;

下一步,我们就开始学习基础语法之 14 - 隐式字段,或是返回 Dataview基本语法

讨论

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



反馈交流

其他渠道

版权声明