Dataview 实战
Dataview 是 Obsidian 最强大的数据处理插件,本指南通过实际案例帮助你掌握其用法。
基础查询
LIST 查询
最简单的列表形式查询:
dataview
LIST
FROM "笔记文件夹"
WHERE file.mtime >= date(today) - dur(7天)
SORT file.mtime DESC参数说明:
LIST:以列表形式显示FROM:数据来源(文件夹/标签)WHERE:筛选条件SORT:排序方式
TABLE 查询
表格形式展示更多字段:
dataview
TABLE
file.ctime AS "创建时间",
file.mtime AS "修改时间",
author AS "作者",
status AS "状态"
FROM "项目"
WHERE status = "进行中"
SORT file.mtime DESC任务查询
查询所有未完成任务:
dataview
TASK
FROM "任务"
WHERE !completed常用查询示例
最近修改的笔记
dataview
TABLE
file.mtime AS "修改时间",
file.folder AS "位置"
FROM ""
WHERE file.mtime >= date(today) - dur(7天)
SORT file.mtime DESC
LIMIT 10按标签分类
dataview
TABLE
file.ctime AS "创建时间",
tags AS "标签"
FROM "#读书笔记"
SORT file.ctime DESC项目进度追踪
dataview
TABLE
progress AS "进度",
deadline AS "截止日期",
status AS "状态"
FROM "项目"
WHERE status != "已完成"
SORT deadline ASC书籍阅读清单
dataview
TABLE
author AS "作者",
rating AS "评分",
status AS "阅读状态"
FROM "书籍"
WHERE type = "book"
SORT rating DESC高级查询技巧
计算字段
使用表达式创建计算字段:
dataview
TABLE
file.name AS "笔记名",
length(file.content) AS "字数",
round(length(file.content)/1000, 1) AS "千字"
FROM "文章"
SORT length(file.content) DESC链接字段
展示和操作链接:
dataview
TABLE
author AS "作者",
link(file.link, "查看") AS "链接"
FROM "文章"日期计算
计算日期相关值:
dataview
TABLE
file.ctime AS "创建时间",
date(today) - file.ctime AS "距今天数"
FROM "笔记"
WHERE file.ctime <= date(today) - dur(30天)分组显示
使用 GROUP BY 分组:
dataview
TABLE
rows.file.name AS "笔记"
FROM "项目"
GROUP BY status嵌套字段
访问嵌套的 YAML 字段:
yaml
---
meta:
author: 张三
info:
created: 2024-01-01
updated: 2024-01-15
---dataview
TABLE
meta.author AS "作者",
meta.info.created AS "创建日期"
FROM ""
WHERE metaDataviewJS
什么是 DataviewJS
DataviewJS 允许使用 JavaScript 编写更复杂的查询:
dataviewjs
dv.table(
["笔记名", "创建时间", "字数"],
dv.pages()
.sort(p => p.file.ctime, 'desc')
.limit(10)
.map(p => [
p.file.link,
p.file.ctime.toFormat("yyyy-MM-dd"),
p.file.length
])
)动态统计
dataviewjs
// 统计各标签的笔记数量
const tags = dv.pages()
.flatMap(p => p.file.tags)
.groupBy(t => t)
.map(t => ({tag: t.key, count: t.rows.length}))
.sort(t => t.count, 'desc');
dv.table(["标签", "笔记数"], tags.map(t => [t.tag, t.count]));进度条
dataviewjs
// 显示项目进度条
const pages = dv.pages("#project");
for (let page of pages) {
const progress = page.progress || 0;
const bar = "█".repeat(Math.floor(progress/10)) + "░".repeat(10-Math.floor(progress/10));
dv.paragraph(`**${page.file.name}**: ${bar} ${progress}%`);
}最近活动
dataviewjs
// 最近 7 天的活动
const week = dv.pages()
.where(p => p.file.mtime >= dv.date("today") - dur("7 days"))
.sort(p => p.file.mtime, 'desc');
dv.table(
["日期", "笔记", "修改时间"],
week.map(p => [
p.file.mtime.toFormat("MM-dd"),
p.file.link,
p.file.mtime.toFormat("HH:mm")
])
);实战案例
每周回顾
dataview
TABLE
choice(completed, "✅", "⬜") AS "状态",
task AS "任务"
FROM "日记"
WHERE file.ctime >= date(today) - dur(7天)阅读统计
dataviewjs
// 本月阅读统计
const books = dv.pages("#书籍")
.where(p => p.read_date && p.read_date.month === dv.date("today").month);
dv.paragraph(`📚 本月已读: ${books.length} 本`);
dv.table(
["书名", "作者", "评分"],
books.map(b => [b.file.link, b.author, "⭐".repeat(b.rating || 0)])
);任务看板
dataviewjs
// 简易看板
const tasks = {
"待办": dv.pages().where(p => p.status === "todo"),
"进行中": dv.pages().where(p => p.status === "doing"),
"已完成": dv.pages().where(p => p.status === "done")
};
for (let [status, pages] of Object.entries(tasks)) {
dv.header(3, `${status} (${pages.length})`);
dv.list(pages.map(p => p.file.link));
}知识图谱统计
dataviewjs
// 统计笔记关联
const notes = dv.pages();
const links = notes.flatMap(p => p.file.inlinks);
const mostLinked = links
.groupBy(l => l.path)
.map(g => ({note: g.key, count: g.rows.length}))
.sort(l => l.count, 'desc')
.limit(10);
dv.table(["笔记", "被引用次数"], mostLinked.map(l => [dv.fileLink(l.note), l.count]));性能优化
限制结果
使用 LIMIT 提高性能:
dataview
TABLE file.name
FROM ""
LIMIT 100避免全局搜索
指定具体文件夹:
dataview
-- 推荐
FROM "特定文件夹"
-- 避免全局搜索
FROM ""索引字段
在 frontmatter 中定义索引字段:
yaml
---
tags: [项目, 重要]
status: 进行中
priority: 高
---常见问题
查询不显示
- 检查 YAML 格式是否正确
- 确认字段名称拼写无误
- 查看 Obsidian 控制台错误
中文排序问题
使用自定义排序:
dataviewjs
dv.pages("笔记")
.sort(p => p.file.name, 'asc', 'zh-CN')日期格式化
dataviewjs
// 格式化日期
dv.date("2024-01-15").toFormat("yyyy年MM月dd日")提示
Dataview 的强大在于可以动态展示笔记数据,建议从简单查询开始,逐步学习高级功能!
INFO
结合 Templater 插件使用,可以实现更强大的自动化工作流!