Obsidian Dataview 插件完整功能展示
Dataview 是 Obsidian 的强大插件,可以:
类比:就像给笔记库添加了 SQL 数据库功能!
最常用的查询类型,以表格形式展示数据:
TABLE date, mood, weather
FROM "diary"
WHERE !draft
SORT date DESC
LIMIT 10
展示最近 10 篇日记的日期、心情和天气
以列表形式展示:
LIST
FROM "posts"
WHERE tags contains "技术"
SORT date DESC
列出所有包含”技术”标签的文章
展示任务项:
TASK
FROM "todo"
WHERE status != "done"
GROUP BY priority
按优先级分组显示未完成任务
TABLE WITHOUT ID
mood as "心情",
length(rows) as "次数"
FROM "diary"
WHERE !draft
GROUP BY mood
SORT length(rows) DESC
效果:统计每种心情出现的次数
TABLE date, mood, weather
FROM "diary"
WHERE location = "家" AND !draft
SORT date DESC
LIMIT 20
效果:查看在家写的所有日记
TABLE date as "日期", mood as "心情"
FROM "diary"
WHERE date.month = date(today).month
AND date.year = date(today).year
AND !draft
SORT date DESC
效果:本月的所有日记条目
TABLE dueDate as "截止", category as "分类"
FROM "todo"
WHERE priority = "high"
AND status != "done"
AND !draft
SORT dueDate ASC
效果:所有高优先级未完成任务
TABLE dueDate as "已逾期", priority as "优先级"
FROM "todo"
WHERE dueDate < date(today)
AND status != "done"
AND !draft
SORT priority DESC, dueDate ASC
效果:按优先级显示逾期任务
TABLE WITHOUT ID
category as "分类",
length(rows) as "总数",
length(rows.where(r => r.status = "done")) as "已完成"
FROM "todo"
WHERE !draft
GROUP BY category
效果:每个分类的任务完成情况
高级查询与自定义输出
Dataview 查询
DataviewJS
const todos = dv.pages('"todo"').where(p => !p.draft);
const total = todos.length;
const completed = todos.where(p => p.status === "done").length;
const rate = Math.round((completed / total) * 100);
dv.paragraph(`📈 **完成率: ${rate}%**`);
dv.paragraph(`✅ 已完成: ${completed} / ${total}`);
输出:📈 完成率: 75%
✅ 已完成: 15 / 20
const diaries = dv.pages('"diary"').where(p => !p.draft);
const byMonth = {};
diaries.forEach(d => {
const month = `${d.date.year}-${String(d.date.month).padStart(2, '0')}`;
byMonth[month] = (byMonth[month] || 0) + 1;
});
dv.table(
["月份", "日记数"],
Object.entries(byMonth).sort().map(([m, count]) => [m, count])
);
const allContent = [
...dv.pages('"diary"').where(p => !p.draft),
...dv.pages('"todo"').where(p => !p.draft),
...dv.pages('"posts"').where(p => !p.draft)
];
const tagCounts = {};
allContent.forEach(item => {
if (item.tags) {
item.tags.forEach(tag => {
tagCounts[tag] = (tagCounts[tag] || 0) + 1;
});
}
});
const sorted = Object.entries(tagCounts)
.sort((a, b) => b[1] - a[1])
.slice(0, 10);
dv.table(["标签", "使用次数"], sorted);
TABLE date as "日期"
FROM "diary"
WHERE date >= date(today) - dur(7 days)
AND !draft
SORT date DESC
效果:最近 7 天的日记
其他日期函数:
date(today) - 今天dur(7 days) - 7天时长date.year, date.month, date.day - 年月日LIST
FROM "posts"
WHERE contains(title, "教程")
OR contains(tags, "tutorial")
AND !draft
SORT date DESC
效果:标题或标签包含”教程”的文章
其他字符串函数:
contains() - 包含startswith() - 以…开始endswith() - 以…结束TABLE dueDate, priority, status
FROM "todo"
WHERE (priority = "high" OR priority = "medium")
AND status != "done"
AND dueDate <= date(today) + dur(3 days)
AND !draft
SORT priority DESC, dueDate ASC
效果:3天内到期的中高优先级任务
组合多个查询创建综合视图:
const startOfWeek = dv.date("today").startOf("week");
const endOfWeek = dv.date("today").endOf("week");
const thisWeek = {
diaries: dv.pages('"diary"')
.where(p => p.date >= startOfWeek && p.date <= endOfWeek && !p.draft),
todos: dv.pages('"todo"')
.where(p => p.date >= startOfWeek && p.date <= endOfWeek && !p.draft)
};
dv.header(2, "📅 本周活动");
dv.list([
`📝 ${thisWeek.diaries.length} 篇日记`,
`✅ ${thisWeek.todos.length} 个新任务`
]);
TABLE
title as "目标",
progress as "进度",
status as "状态"
FROM "todo"
WHERE category = "目标"
AND !draft
SORT progress DESC
可视化追踪长期目标进度
✅ 推荐
LIMIT 限制结果!draft 草稿WHERE 条件GROUP BY⚠️ 避免
💡 建议
1. 逐步构建
2. 使用 LIST
3. 检查字段名 - 使用 TABLE file.frontmatter 查看所有字段
Dataview
社区资源
在你的笔记库中:
template/Dashboard.md - 个人仪表板template/DATAVIEW-EXAMPLES.md - 查询示例集合docs/obsidian-integration-examples.md - 完整文档提示: 在 Obsidian 中打开这些文件,实时看到查询效果!
在 Obsidian 中打开任意模板文件:
template/Dashboard.md提示: Dataview 查询会自动更新,无需刷新!
掌握 SQL 查询
学习所有查询类型和函数
学习 DataviewJS
用 JavaScript 实现高级功能
创建模板
构建可复用的查询模板
✅ 将笔记变成数据库
✅ 实时动态查询
✅ 强大灵活的功能
✅ 无限可能性
🌟 开始探索 Dataview 的强大功能!