Obsidian Dataview 速查表
版本unknown 更新日志2026-01-26 GitHubblacksmithgu/obsidian-dataview
340px

📝 元数据核心 >>>

Frontmatter (YAML)

---
author: "Edgar Allan Poe"
published: 1845-01-01
tags: [poems, horror]
rating: 5
price: 19.99
contact:
  email: "test@example.com"
---

行内字段 (Inline)

Basic Field:: Some Value
I rate this [rating:: 9]!
Hidden key (secretKey:: value)

列表/任务字段

- [ ] 发邮件 [due:: 2024-12-31]
- 购买 [quantity:: 5] 苹果
💡 嵌套访问: contact.email | 数组索引: tags[0]

📋 隐式字段 (file.*) >>>

基本信息

  • file.name - 文件名 (不含扩展)
  • file.folder - 父文件夹路径
  • file.path - 完整路径
  • file.link - 文件链接对象
  • file.ext - 扩展名 (.md)
  • file.size - 大小 (字节)
  • file.aliases - 别名数组

时间字段

  • file.cday - 创建日期 (日粒度)
  • file.mday - 修改日期 (日粒度)
  • file.ctime - 创建时间 (datetime)
  • file.mtime - 修改时间 (datetime)
  • file.day - 自动提取的日期

链接与标签

  • file.tags - 所有标签 (含嵌套展开)
  • file.etags - 显式标签 (仅 #tag)
  • file.outlinks - 出链数组
  • file.inlinks - 入链数组

列表与任务

  • file.lists - 所有列表项
  • file.tasks - 所有任务

📂 FROM 数据源 >>>

标签与文件夹

FROM #tag              "标签及其子标签"
FROM #tag AND -"exclude" "排除某文件夹"
FROM "folder/"         "文件夹及其子文件夹"
FROM "folder" AND #tag "组合条件"

文件与链接

FROM [[Note]]          "指定页面"
FROM outgoing([[Note]]) "Note 链接出的页面"
FROM incoming([[Note]]) "链接到 Note 的页面"
FROM [[Note]] OR #tag  "多数据源"

组合与排除

FROM #a AND #b         "同时满足"
FROM #a OR #b           "满足任一"
FROM #tag AND -"30 School" "排除"
FROM ("path/" OR [[Note]]) AND -#archive
💡 可用括号改变优先级,支持 NOT 前缀

🔍 查询结构 >>>

通用格式

TABLE file.day, (price * 0.8) AS "Discount"
FROM "Books"
WHERE rating >= 4
SORT file.day DESC

操作符

  • 比较: = != < > <= >=
  • 逻辑: & (且) | (或) ! (非)
  • 算术: + - * /

日期简写

  • date(today) date(yesterday) date(tomorrow)
  • date(now) - 当前时刻
  • date(sow) - 本周初 (Start of Week)
  • date(eom) - 本月末 (End of Month)
  • date(som) - 本月初 (Start of Month)

📊 查询类型 >>>

TABLE - 表格视图

TABLE author, published, rating AS "Score"
FROM #books
WHERE rating >= 4

LIST - 列表视图

LIST file.link
FROM #projects
WHERE !completed

TASK - 任务视图

TASK
FROM #work
WHERE !completed AND due <= date(today)

CALENDAR - 日历视图

CALENDAR file.cday
FROM #journal

⚙️ 数据命令 >>>

WHERE - 筛选

WHERE !completed          "字段不存在或为空"
WHERE completed           "字段存在且为真"
WHERE due AND due < date(today)
WHERE file.mtime >= date(today) - dur(7 days)
WHERE contains(tags, "work")
WHERE icontains(author, "john")

SORT - 排序

SORT file.ctime DESC      "降序"
SORT rating ASC, file.name ASC "多字段"

LIMIT - 限制

LIMIT 10                  "取前10条"

🔀 FLATTEN & GROUP BY >>>

FLATTEN - 展开数组

FLATTEN authors           "每作者一行"
FLATTEN file.tags AS tag   "带别名展开"
FLATTEN list(1,2,3) AS num

GROUP BY - 分组

⚠️ 分组后通过 rows 访问原始字段
GROUP BY file.folder
SORT rows.file.ctime DESC

分组后聚合

GROUP BY author
FLATTEN length(rows) AS "count"
FLATTEN sum(rows.rating) AS "total"
FLATTEN average(rows.rating) AS "avg"
SORT count DESC
💡 常用聚合: length(rows), min/max/sum/average(rows.field)

🧮 表达式与类型 >>>

字段不存在/空值处理

WHERE !field             "不存在或空值"
WHERE field              "存在且非空"
WHERE default(rating, 0) >= 3
WHERE field != ""        "字符串非空"

日期与时长运算

WHERE file.day >= date(sow) - dur(7 days)
WHERE due + dur(1 day) <= date(today)
WHERE striptime(due) = striptime(date(today))
WHERE dateformat(due, "yyyy-MM") = "2024-01"

字符串操作

WHERE contains(title, "Note")
WHERE regexmatch("^\d{4}", file.name)
WHERE lower(author) = lower("JOHN")
WHERE split(tags, "/")[0] = "work"

链接与列表

WHERE contains(file.outlinks, [[Target]])
WHERE meta(link).path = "path/to/note"
WHERE length(file.tags) > 0

🛠️ 常用函数速查 >>>

构造函数

  • list(a, b, c) - 创建数组
  • object("key", val) - 创建对象
  • date("2024-01-01") - 解析日期
  • dur("3 days") - 解析时长
  • link("path", "显示名") - 创建链接
  • choice(true, "yes", "no") - 条件选择

数值与统计

  • round(3.14159, 2) - 四舍五入
  • min/max(a, b) - 最值
  • sum/avg(array) - 求和/平均
  • length(array) - 长度

字符串

  • contains/replace/split - 包含/替换/分割
  • - >icontains忽略大小写包含
  • regexmatch/regexreplace - 正则
  • lower/upper - 大小写

日期格式化

  • dateformat(date, "yyyy-MM-dd")
  • dateformat(date, "HH:mm")
  • dateformat(date, "cccc") - 星期几
  • striptime(date) - 去除时间

✅ TASK 场景模板 >>>

任务字段

  • completed - 是否完成 (bool)
  • fullyCompleted - 子任务全部完成
  • status - 状态字符 (x/-/>)
  • text - 任务文本
  • due - 截止日期
  • section - 所在标题链接

常用模板

"未完成任务"
TASK WHERE !completed

"逾期任务"
TASK WHERE !completed AND due < date(today)

"最近到期"
TASK WHERE due AND due >= date(sow)
SORT due ASC

"按项目分组统计"
TASK FROM #projects
GROUP BY section
FLATTEN length(rows) AS "count"
SORT count DESC

状态筛选

TASK WHERE status = ">"   "进行中"
TASK WHERE status = "-"   "待办"
TASK WHERE status = "x"   "已完成"

🔗 行内查询 (Inline) >>>

行内表达式

共有 = dv.pages("#books").length 本书
评分: = this.rating
更新时间: = dateformat(this.file.mtime, "yyyy-MM-dd")

内联 DQL 块

\`\``dataview
LIST file.link
FROM #projects
LIMIT 5
\`\`\`

行内 JS 表达式

当前时间: =[[$= dv.date("now").toFormat("yyyy-MM-dd HH:mm")]]
💡 行内表达式可在任意位置嵌入结果

⚡ DataviewJS >>>

JavaScript 高级查询,需要放入 ```dataviewjs 代码块
let pages = dv.pages("#book");

// 表格: 链接与评分
dv.table(
  ["File", "Rating"],
  pages.map(p => [p.file.link, p.rating])
);

// 任务: 未完成且过期
dv.taskList(
  pages.file.tasks
  .where(t => !t.completed && t.due < dv.date("today"))
);

常用 API

  • dv.pages("#tag") - 查询页面
  • dv.page(path) - 单个页面
  • dv.current() - 当前文件
  • dv.table(headers, rows) - 表格
  • dv.list(array) - 列表
  • dv.taskList(tasks) - 任务列表

🔄 DataArray 链式操作 >>>

链式方法

dv.pages("#book")
  .where(p => p.rating >= 4)
  .sort(p => p.published, "desc")
  .map(p => [p.file.link, p.rating])

常用方法

  • .where(predicate) - 过滤
  • .sort(field, [order]) - 排序
  • .map(func) - 映射
  • .filter(func) - 过滤 (同 where)
  • .flatten(arrayField) - 展开数组
  • .groupBy(field) - 分组
  • .length - 长度
  • .first(n) - 取前 n 条
  • .array - 转为普通数组

实战示例

// 按标签分组统计
dv.pages("#note")
  .flatten(p => p.tags)
  .groupBy(t => t)
  .sort(g => g.rows.length, "desc")
  .forEach(g => {
    dv.header(3, g.key + ": " + g.rows.length);
  });

🐛 调试与排错 >>>

常用调试技巧

"查看实际字段值"
TABLE field1, field2
FROM [[CurrentPage]]

"检查字段是否存在"
TABLE file.name, field
WHERE file.name = [[CurrentPage]].file.name

常见问题

  • 无结果: 检查字段名拼写、类型是否匹配
  • 日期比较失败: 用 striptime() 去除时间部分
  • 空值问题: 用 default(field, value)
  • 数组包含: 用 contains() 而不是 =

类型转换

  • date(string) - 字符串转日期
  • number(string) - 字符串转数字
  • string(any) - 任意转字符串