Dataview 查询速查表
这是 Obsidian Dataview 插件的完整语法参考,包含所有查询类型和常用示例。
📋 目录
基础语法
三种查询模式
markdown
```dataview
TABLE 字段1, 字段2
FROM "路径"
WHERE 条件
```
```dataview
LIST
FROM "路径"
WHERE 条件
```
```dataview
TASK
FROM "路径"
WHERE 条件
```基本结构
dataview
查询类型 [字段列表]
FROM 数据源
[操作符]
[操作符]
...查询类型
TABLE - 表格视图
dataview
TABLE file.name AS "文件名", file.ctime AS "创建时间"
FROM "日记"
WHERE file.ctime >= date(today) - dur(7 days)LIST - 列表视图
dataview
LIST
FROM "项目"
WHERE status = "进行中"TASK - 任务视图
dataview
TASK
FROM "任务"
WHERE !completedCALENDAR - 日历视图
dataview
CALENDAR file.ctime
FROM "日记"
WHERE file.ctime >= date(today) - dur(30 days)数据源
路径查询
dataview
FROM "文件夹名" # 特定文件夹
FROM "文件夹/子文件夹" # 子文件夹
FROM "日记/2024" # 嵌套路径标签查询
dataview
FROM #标签名 # 单个标签
FROM #标签1 OR #标签2 # 多个标签(或)
FROM #标签1 AND #标签2 # 多个标签(且)
FROM -#标签名 # 排除标签链接查询
dataview
FROM [[笔记名]] # 链接到该笔记的文件
FROM outgoing([[笔记名]]) # 该笔记链接到的文件组合查询
dataview
FROM "项目" AND #重要
FROM "工作" OR "生活"
FROM "日记" AND -#草稿
FROM (#项目 OR #任务) AND "2024"字段与元数据
内置字段
| 字段 | 说明 | 示例 |
|---|---|---|
file.name | 文件名(无扩展名) | "我的笔记" |
file.folder | 文件夹路径 | "日记/2024" |
file.path | 完整路径 | "日记/2024/我的笔记.md" |
file.ext | 文件扩展名 | "md" |
file.link | 文件链接 | [[我的笔记]] |
file.size | 文件大小(字节) | 2048 |
file.ctime | 创建时间 | 2024-01-15T10:30:00 |
file.mtime | 修改时间 | 2024-01-20T15:45:00 |
file.tags | 所有标签 | [#标签1, #标签2] |
file.inlinks | 入链数量 | 5 |
file.outlinks | 出链数量 | 8 |
file.day | 日期(从文件名) | 2024-01-15 |
file.starred | 是否星标 | true/false |
自定义字段(YAML Frontmatter)
yaml
---
title: 我的笔记
author: 张三
date: 2024-01-15
status: 进行中
tags:
- 重要
- 工作
priority: 5
---使用方式:
dataview
TABLE author, status, priority
FROM "项目"
WHERE priority >= 4内联字段
markdown
作者:: 张三
状态:: 进行中
优先级:: 5
日期:: 2024-01-15使用方式:
dataview
TABLE 作者, 状态, 优先级
FROM "笔记"
WHERE 优先级 >= 4操作符
WHERE - 过滤条件
dataview
WHERE file.ctime >= date(today) - dur(7 days)
WHERE status = "进行中"
WHERE priority >= 4
WHERE contains(file.tags, "#重要")
WHERE author != null
WHERE !completedSORT - 排序
dataview
SORT file.ctime DESC # 按创建时间降序
SORT file.mtime ASC # 按修改时间升序
SORT priority DESC, file.name ASC # 多字段排序LIMIT - 限制数量
dataview
LIMIT 10 # 只显示前10条
LIMIT 5GROUP BY - 分组
dataview
TABLE rows.file.name AS "笔记"
FROM "项目"
GROUP BY statusFLATTEN - 展平数组
dataview
TABLE author
FROM "书籍"
FLATTEN author AS 作者函数
聚合函数
dataview
length(数组) # 数组长度
sum(数值数组) # 求和
average(数值数组) # 平均值
min(数组) / max(数组) # 最小值/最大值
all(数组) # 所有元素为真
any(数组) # 任一元素为真
none(数组) # 所有元素为假字符串函数
dataview
contains(字符串, 子串) # 包含判断
icontains(字符串, 子串) # 不区分大小写的包含
startswith(字符串, 前缀) # 以...开始
endswith(字符串, 后缀) # 以...结束
regexmatch(字符串, 正则) # 正则匹配
lower(字符串) # 转小写
upper(字符串) # 转大写
split(字符串, 分隔符) # 分割字符串
join(数组, 分隔符) # 连接数组日期函数
dataview
date(日期字符串) # 解析日期
date(today) # 今天
date(now) # 现在
date(sow) # 本周开始
date(eow) # 本周结束
date(som) # 本月开始
date(eom) # 本月结束
date(soy) # 今年开始
date(eoy) # 今年结束
# 日期运算
file.ctime + dur(7 days) # 7天后
file.mtime - dur(1 month) # 1个月前
date(today) - file.day # 距今天数数组函数
dataview
contains(数组, 元素) # 包含元素
filter(数组, 条件) # 过滤
map(数组, 函数) # 映射
flat(数组) # 展平
slice(数组, 开始, 结束) # 切片
sort(数组) # 排序
reverse(数组) # 反转
unique(数组) # 去重数学函数
dataview
round(数值) # 四舍五入
floor(数值) # 向下取整
ceil(数值) # 向上取整
abs(数值) # 绝对值
sqrt(数值) # 平方根
pow(底数, 指数) # 幂运算
log(数值) # 自然对数链接函数
dataview
link(路径) # 创建链接
embed(链接) # 嵌入链接
elink(url) # 外部链接元数据函数
dataview
meta(链接) # 获取链接元数据
default(值, 默认值) # 提供默认值
choice(条件, 真值, 假值) # 条件选择
striptime(日期) # 移除时间部分表达式
比较运算符
dataview
= 或 == 等于
!= 或 <> 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于逻辑运算符
dataview
AND 与
OR 或
NOT 非算术运算符
dataview
+ 加
- 减
* 乘
/ 除
% 取模字符串拼接
dataview
"前缀" + file.name + "后缀"
file.folder + "/" + file.name条件表达式
dataview
choice(condition, true_value, false_value)
choice(priority >= 4, "🔴 重要", "🟢 普通")
choice(status = "完成", "✅", "⏳")实战示例
📅 最近修改的笔记
dataview
TABLE file.mtime AS "修改时间", file.folder AS "位置"
FROM ""
WHERE file.mtime >= date(today) - dur(7 days)
SORT file.mtime DESC
LIMIT 20📚 阅读清单
dataview
TABLE author AS "作者", rating AS "评分", status AS "状态"
FROM "书籍"
WHERE status != "已读"
SORT rating DESC, author ASC✅ 未完成任务
dataview
TASK
FROM "任务"
WHERE !completed AND !file.completed
SORT file.ctime ASC📊 项目进度追踪
dataview
TABLE
choice(progress >= 100, "✅ 完成",
choice(progress >= 50, "🟡 进行中", "🔴 开始")) AS "状态",
progress AS "进度%",
deadline AS "截止日期"
FROM "项目"
WHERE status = "进行中"
SORT deadline ASC🏷️ 标签统计
dataview
TABLE length(rows) AS "笔记数量"
FROM ""
FLATTEN file.tags AS tag
GROUP BY tag
SORT length(rows) DESC
LIMIT 10📅 日记统计
dataview
TABLE
file.day AS "日期",
length(file.inlinks) AS "入链",
length(file.outlinks) AS "出链"
FROM "日记"
WHERE file.day >= date(today) - dur(30 days)
SORT file.day DESC📝 字数统计
dataview
TABLE
file.name AS "笔记名",
file.size AS "大小",
length(file.name) AS "文件名长度"
FROM ""
WHERE file.size > 1000
SORT file.size DESC
LIMIT 10📂 文件夹概览
dataview
TABLE
length(rows) AS "笔记数",
min(rows.file.ctime) AS "最早创建",
max(rows.file.mtime) AS "最近修改"
FROM ""
GROUP BY file.folder
SORT length(rows) DESC🔗 关联笔记
dataview
LIST
FROM [[当前笔记]]
WHERE file.name != "当前笔记"
SORT file.ctime DESC⏰ 即将到期任务
dataview
TABLE task AS "任务", deadline AS "截止日期",
choice(deadline < date(today), "⚠️ 已过期",
choice(deadline <= date(today) + dur(3 days), "🔴 紧急", "🟢 正常")) AS "状态"
FROM "任务"
WHERE deadline != null AND !completed
SORT deadline ASCDataviewJS 高级用法
基本结构
markdown
```dataviewjs
dv.table(["列1", "列2"], [
["值1", "值2"],
["值3", "值4"]
])
```动态查询
dataviewjs
// 获取最近7天的日记
const pages = dv.pages('"日记"')
.where(p => p.file.day >= dv.date('today') - dv.duration('7 days'))
.sort(p => p.file.day, 'desc');
dv.table(["日期", "字数"],
pages.map(p => [p.file.link, p.file.size])
);分组显示
dataviewjs
for (let group of dv.pages('"项目"').groupBy(p => p.status)) {
dv.header(3, group.key);
dv.list(group.rows.map(p => p.file.link));
}任务统计
dataviewjs
const tasks = dv.pages('"任务"').file.tasks;
const completed = tasks.where(t => t.completed).length;
const total = tasks.length;
const percent = Math.round(completed / total * 100);
dv.paragraph(`进度: ${completed}/${total} (${percent}%)`);进度条
dataviewjs
const progress = 75;
const bars = Math.round(progress / 5);
const empty = 20 - bars;
dv.paragraph(
`[${"█".repeat(bars)}${"░".repeat(empty)}] ${progress}%`
);条件样式
dataviewjs
dv.table(["项目", "状态"],
dv.pages('"项目"').map(p => {
const status = p.progress >= 100 ? "✅" :
p.progress >= 50 ? "🟡" : "🔴";
return [p.file.link, status];
})
);内联查询
基本语法
markdown
`= this.field_name`
`= this.file.name`
`= date(today)`示例
markdown
当前文件: `= this.file.name`
创建时间: `= this.file.ctime`
修改时间: `= this.file.mtime`
今天是: `= date(today)`
本周开始: `= date(sow)`
本月结束: `= date(eom)`内联计算
markdown
距离创建已有: `= date(today) - this.file.ctime` 天
文件大小: `= round(this.file.size / 1024, 2)` KB
标签数量: `= length(this.file.tags)` 个条件内联查询
markdown
状态: `= choice(this.status = "进行中", "🔴 忙碌", "🟢 闲暇")`
优先级: `= choice(this.priority >= 4, "高", "低")`常见问题
日期比较
dataview
# 正确
WHERE file.day >= date(2024-01-01)
WHERE file.ctime >= date(today) - dur(7 days)
# 错误
WHERE file.day >= "2024-01-01" # 字符串比较空值处理
dataview
# 使用 default 函数
WHERE default(priority, 0) >= 3
# 或排除空值
WHERE priority != null中文排序
dataview
# 拼音排序
SORT choice(中文字段 != null, 中文字段, "") ASC性能优化
dataview
# 限制查询范围
FROM "特定文件夹" # 而不是 FROM ""
# 先限制后排序
FROM "日记"
WHERE file.day >= date(today) - dur(30 days)
SORT file.day DESC
LIMIT 10相关资源
💡 提示
将此页面添加到书签,随时查阅!遇到问题时检查语法和字段名是否正确。