Skip to content

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 !completed

CALENDAR - 日历视图

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 !completed

SORT - 排序

dataview
SORT file.ctime DESC           # 按创建时间降序
SORT file.mtime ASC            # 按修改时间升序
SORT priority DESC, file.name ASC  # 多字段排序

LIMIT - 限制数量

dataview
LIMIT 10                       # 只显示前10条
LIMIT 5

GROUP BY - 分组

dataview
TABLE rows.file.name AS "笔记"
FROM "项目"
GROUP BY status

FLATTEN - 展平数组

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 ASC

DataviewJS 高级用法

基本结构

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

相关资源


💡 提示

将此页面添加到书签,随时查阅!遇到问题时检查语法和字段名是否正确。

最后更新:2026年3月13日编辑此页反馈问题