Skip to content

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 meta

DataviewJS

什么是 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 插件使用,可以实现更强大的自动化工作流!

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