📝 元数据核心 >>>
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) - 任意转字符串