用 Obsidian Dataview 查询你保存的网页内容
你已经向 Obsidian 保存网页内容好几周了。你的知识库有 50 篇,甚至 100 篇剪藏的文章。但要找到合适的那篇,你只能在文件夹中滚动浏览,或依赖全文搜索。
Dataview 改变了这一切。它将你的 Markdown 文件视为数据库——按元数据查询、按标签筛选、按日期排序,并构建自动更新的仪表板。
以下是如何为你的网页剪藏设置它。
Dataview 能做什么
Dataview 是一个 Obsidian 插件,让你可以使用类 SQL 语法查询你的笔记。每个 Markdown 文件成为一行。每个 frontmatter 字段成为一列。每个查询返回一个实时自动更新的表格。
基础:Frontmatter
Dataview 的威力依赖于剪藏文件中一致的 frontmatter。当你用 Save 保存网页内容时,添加这些元数据:
---
title: "React Server Components: 完全指南"
source: "https://example.com/rsc-guide"
clipped: 2026-03-15
type: article
status: unread
tags: [react, server-components, performance]
rating:
---
让网页剪藏可查询的字段:
- clipped — 保存时间
- type — article、tutorial、documentation、paper、thread
- status — unread、reading、read、processed
- rating — 阅读后的 1-5 评分(初始留空)
- tags — 涵盖的主题
基本查询
阅读队列
查看所有未读剪藏,最新的排在前面:
```dataview
TABLE title, type, clipped
FROM "clips"
WHERE status = "unread"
SORT clipped DESC
```
最近阅读
过去 30 天内处理的内容:
```dataview
TABLE title, rating, tags
FROM "clips"
WHERE status = "read" AND clipped >= date(today) - dur(30 days)
SORT rating DESC
```
按主题的最佳内容
查找某个特定主题中评分最高的剪藏:
```dataview
TABLE title, rating, source
FROM "clips"
WHERE contains(tags, "react") AND rating >= 4
SORT rating DESC
```
内容类型分布
你保存了多少种类型:
```dataview
TABLE length(rows) AS Count
FROM "clips"
GROUP BY type
SORT length(rows) DESC
```
需要处理的剪藏
查找你还没有回顾的保存内容:
```dataview
TABLE title, type, clipped
FROM "clips"
WHERE !rating
SORT clipped ASC
LIMIT 10
```
构建研究仪表板
创建一个名为 Dashboard.md 的笔记来汇总所有查询:
# 研究仪表板
## 阅读队列({{date}})
### 未读文章
(dataview 查询放这里)
### 进行中
(dataview 查询放这里)
## 本周保存
(dataview 查询放这里)
## 评分最高的内容
(dataview 查询放这里)
## 按主题
(dataview 查询放这里)
每次你打开它时,这个仪表板都会自动更新。无需手动维护。
进阶:内联查询
Dataview 还支持笔记内的内联查询。在任何地方引用剪藏数量或元数据:
本月我已读了 `= length(filter(pages("clips"), (p) => p.status = "read"))` 篇文章,
平均评分为
`= round(average(filter(pages("clips"), (p) => p.rating).rating), 1)`。
这将渲染为纯文本:「本月我已读了 23 篇文章,平均评分为 3.8。」
DataviewJS 处理复杂查询
对于更复杂的分析,使用 DataviewJS(JavaScript):
```dataviewjs
// 显示过去 8 周每周的剪藏数量
const clips = dv.pages('"clips"')
.where(p => p.clipped)
.sort(p => p.clipped, 'desc');
const weeks = {};
for (const clip of clips) {
const week = clip.clipped.toFormat("yyyy-'W'WW");
weeks[week] = (weeks[week] || 0) + 1;
}
dv.table(
["周", "保存的剪藏"],
Object.entries(weeks).slice(0, 8).map(([week, count]) => [week, count])
);
```
保持数据干净的技巧
使用模板
为剪藏创建一个预填 frontmatter 的模板,使每次保存都保持一致:
---
title: ""
source: ""
clipped: {{date}}
type: article
status: unread
tags: []
rating:
---
规范化你的标签
选择一套标准并坚持使用。react 而不是 React 或 reactjs。performance 而不是 perf 或 web-performance。不一致的标签会破坏 Dataview 查询。
阅读后更新状态
只有在你更新状态字段时,它才能发挥作用。当你读完一个剪藏时,花 10 秒将 status: unread 改为 status: read 并添加评分。
保留来源 URL
source 字段让你总能回到原始内容。Dataview 可以将这些渲染为可点击的链接:
```dataview
TABLE title, "[链接](" + source + ")" AS Source
FROM "clips"
WHERE status = "read"
SORT clipped DESC
LIMIT 20
```
为什么干净的 Markdown 在这里很重要
Dataview 查询你的 frontmatter,但你也会定期搜索剪藏内容。这正是 Save 干净提取的价值所在。
当你搜索知识库中的「服务器组件流式传输」时,你希望找到剪藏中的相关段落——而不是导航菜单、Cookie 横幅或侧边栏小部件。干净的 Markdown 意味着干净的搜索结果。
开始使用
- 在 Obsidian 中安装 Dataview 插件(社区插件 → 搜索「Dataview」)
- 安装 Save 进行干净的网页剪藏
- 使用上面的模板为你接下来的 5 个剪藏添加 frontmatter
- 创建一个带有阅读队列查询的仪表板笔记
- 看着你的知识库从一堆文件转变为可查询的知识库