多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Obsidian Dataview 表格查询实战指南:从 `TABLE` 语法、列别名到隐式字段(附 test-vault 示例库逐例讲解)

Obsidian Dataview 表格查询实战指南:从 `TABLE` 语法、列别名到隐式字段(附 test-vault 示例库逐例讲解) 前端知识管理数据分析【免费下载链接】obsidian-dataviewA data index and query language over Markdown files, for https://obsidian.md/.项目地址https://gitcode.com/gh_mirrors/ob/obsidian-dataview点击查看免费下载Dataview 是 Obsidian 生态中最流行的数据索引与查询引擎它把 Markdown 笔记中的元数据frontmatter、内联字段、标签与任务索引为可查询的数据源并通过DQLDataview Query Language以列表、表格、任务或日历四种视图呈现。本文以仓库自带测试库 test-vault/example tables.md 中三组真实可运行的TABLE查询为骨架完整讲解表格查询的语法、AS列别名规则、file.*隐式字段体系并结合 src/query/parse.ts 与 src/ui/views/table-view.tsx 的源码实现带你掌握从“能跑通查询”到“理解引擎行为”的完整技能。上图是一次典型 DataviewTABLE查询的真实渲染结果来自官方文档示例按Genre分组展示Name、Time Read、Rating列。它展示了表格视图“首列文件/分组 多列元数据”的基本形态也是本文后续所有语法的落点。一、示例文件定位test-vault 中的表格查询样板test-vault是仓库内置的迷你知识库用于给 Dataview 的文档和测试提供真实数据支撑。其中 test-vault/example tables.md 是专门演示表格查询的文件包含三段由浅入深的dataview代码块从blog文件夹取数展示修改时间mtime与自定义字段draft并演示AS别名从recipes文件夹取数展示两个 frontmatter 字段并演示带空格的表头如何书写针对当前文件自身一口气导出全部file.*隐式字段充当“字段速查表”。这三段代码恰好覆盖了TABLE查询的三大核心知识点数据源FROM、字段/别名AS、隐式字段file.*。下面逐段拆解。二、第一段查询AS别名的基本用法table mtime as Modified, draft as Draft from blog语法解析table是查询类型关键字大小写不敏感源码中使用正则TABLE|LIST|TASK|CALENDAR匹配见 src/query/parse.tsmtime as Modified把隐式字段file.mtime最后修改时间以别名Modified展示draft as Draft把页面自定义字段draft以别名Draft展示from blog数据源限定为blog文件夹及其子文件夹文件夹源必须用英文双引号包裹。对照仓库中的真实数据blog文件夹下有两个文件见 test-vault/blog/2020-08-08-an-earlier-post.md--- draft: true start_date: 2021-10-01T02:00:0002:00 --- # A Blog Post in 2020该文件 frontmatter 定义了draft: true因此它命中draft字段而 test-vault/blog/2021-08-08-a-post.md 是空文件查询时该行draft列会显示为空白。执行后大致得到两行结果FileModifiedDraft2020-08-08-an-earlier-post.md该文件 mtimetrue2021-08-08-a-post.md该文件 mtimeAS别名的三条规则别名写在字段名之后格式为字段 AS 别名别名只影响显示不改变底层数据别名若包含空格必须用双引号包裹例如AS Needs Stove否则解析器会把空格后面的内容当作另一个字段或命令关键字官方文档 query-types.md 中明确说明了这一要求。三、第二段查询自定义列头与带空格的别名table cuisine as Cuisine, needsStove as Needs Stove from recipes这一段把上一条的“别名规则”升级到了实用场景needsStove字段被改名为Needs Stove双引号包裹含空格。数据源切换到recipes文件夹仓库中该目录只有两个文件test-vault/recipes/pbj.md 与 test-vault/recipes/toast.md它们都有标准 frontmatter--- cuisine: American needsStove: false thoughtOfDate: 2021-12-11 ---执行该查询后可以得到如下两行结果FileCuisineNeeds Stovepbj.mdAmericanfalsetoast.mdBritishtrue这一段的关键收获cuisine、needsStove都是frontmatter 字段——Dataview 会索引 YAML frontmatter 并直接以字段名引用列头完全由AS决定这与 Obsidian 默认表格的列名无关若某行缺少该字段单元格保持空白而不是报错这是 Dataview 对“字段缺失”的默认宽容策略。四、第三段查询一次性导出全部file.*隐式字段TABLE file.name, file.folder, file.ctime, file.cday, file.mtime, file.mday, file.tags, file.frontmatter, file.name, file.folder, file.ctime, file.cday, file.mtime, file.mday, file.tags, file.frontmatter WHERE file this.file这段查询有两大看点看点一WHERE file this.file的“当前文件”技巧。this在 Dataview 中代表当前所在页面file是该页面的隐式对象本质是一个链接。因此WHERE file this.file会把结果集收缩到“我正在阅读的这一页”使下面的查询变成一个自我审计工具在任何笔记中粘贴这段代码就能把当前页面的全部隐式字段摊开成一张表。看点二file.*字段的完整罗列。Dataview 自动为每个页面注入大量以file为前缀的元数据官方文档 metadata-pages.md 给出了完整清单字段名数据类型含义file.nameText文件名Obsidian 侧边栏显示的名字file.folderText文件所在文件夹路径file.pathText完整文件路径含文件名file.extText文件扩展名一般为mdfile.linkLink指向该文件的链接file.sizeNumber文件大小字节file.ctimeDate with Time文件创建时间file.cdayDate文件创建的日期仅日期部分file.mtimeDate with Time文件最后修改时间file.mdayDate文件最后修改的日期仅日期部分file.tagsList笔记中所有标签子标签按层级拆分#Tag/1/A会存为[#Tag, #Tag/1, #Tag/1/A]file.etagsList笔记中所有显式标签不拆分子标签即[#Tag/1/A]file.inlinksList所有指向该文件的入链file.outlinksList该文件包含的所有出链file.aliasesListfrontmatter 中定义的别名file.tasksList文件中所有任务- [ ] ...file.listsList文件中所有列表项含任务任务视图可渲染它们file.frontmatterListfrontmatter 原始键值对便于检查原始值或动态列出键file.dayDate仅当文件名含yyyy-mm-dd/yyyymmdd日期或有 Date 字段时可用file.starredBoolean是否被 Obsidian 核心插件“书签”收藏注意原示例中file.name与file.frontmatter各重复出现两次这是示例文件本身的冗余写法并无语法错误DQL 允许列字段重复。实际使用时完全可以删去重复项。这张表也是日常写查询时最常用的“字段速查表”把它所在段落与 docs/docs/annotation/metadata-pages.md 配合阅读即可理解TABLE中任何一个file.xxx的来源。五、TABLE查询类型的完整语法继承官方文档在 DQL 中查询类型是唯一必填的部分而TABLE是四种查询类型LIST、TABLE、TASK、CALENDAR中最适合数据透视的一种。官方文档 query-types.md 对TABLE的定义是可输出0 到多个元数据字段作为列字段之间用英文逗号分隔列值不限于普通字段可以是计算表达式用AS header自定义列头默认第一列是文件链接列头显示为 “File”并在表头显示结果数量。多列与计算列TABLE started, file.folder, file.etags FROM #games以及带表达式的版本TABLE default(finished, date(today)) - started AS Played for, file.folder AS Path, file.etags AS File Tags FROM #games后者演示了TABLE的杀手锏列值可以是任意 DQL 表达式default(...)、date(today)、日期减法等详见 expressions.md 与 functions.md并用AS给出语义化的列头。关于首列的设置第一列默认显示File分组时显示 Group可在 Dataview 设置 → Table Settings 中修改Primary Column Name / Group Column Name表头的结果计数可在设置中关闭“Display result count”官方文档说明该选项自 0.5.52 起提供若只想针对某一条查询改首列可用TABLE WITHOUT ID配合file.link AS 自定义名或用它彻底去掉首列此时第一列由你指定的字段担任。TABLE WITHOUT ID file.link AS Game, file.etags AS File Tags FROM #games六、源码级验证一条TABLE查询是如何被解析和渲染的为了让“能跑”变成“懂原理”我们看一下仓库中的真实实现链路1. 查询类型解析src/query/parse.tsP.altstring(P.regexp(/TABLE|LIST|TASK|CALENDAR/i))查询类型由正则匹配TABLE大小写不敏感解析器会为table类型构建对应的查询结构case table随后的FROM、WHERE、SORT、GROUP BY、FLATTEN、LIMIT等数据命令按书写顺序依次处理见 docs/docs/queries/data-commands.md。2. 表格渲染src/ui/views/table-view.tsx渲染端是 Preact 组件TableGrouping它把解析结果中的headings列头数组与values二维 Literal 数组渲染为标准的table classdataview table-view-table表头第一个单元格内通过ResultCount组件按设置决定是否显示结果数量settings.showResultCount。列值经Lit组件统一渲染保证链接、日期、布尔值等在表格中的展示风格一致。3. 引擎执行表格查询最终由query/engine中的executeTable负责求值见 table-view.tsx 的 import 语句数据则来自 Dataview 的内存索引索引构建位于 src/data-index/index.ts。也就是说你在笔记里写的每一个TABLE字段最终都会落到“索引 → 解析 → 求值 → 渲染”这条流水线上。七、与表格查询配合的数据命令Data CommandsTABLE可以与全部数据命令自由组合命令按书写顺序执行且允许重复。常用组合速查完整语义见>赞分享前端知识管理数据分析【免费下载链接】obsidian-dataviewA data index and query language over Markdown files, for https://obsidian.md/.项目地址https://gitcode.com/gh_mirrors/ob/obsidian-dataview点击查看免费下载相关推荐基于 Dataview 的 annotated 字段与任务分组查询实战从 test-vault 示例到源码级解析基于 Dataview 的 annotated 字段与任务分组查询实战从 test vault 示例到源码级解析 在 Obsidian 中使用 Datavie前端知识管理数据分析Obsidian Dataview 查询语言实战示例详解从 DQL 语法到源码级原理Obsidian Dataview 查询语言实战示例详解从 DQL 语法到源码级原理 本文围绕 Dataview 官方示例文档中的 5 个经典 DQLDat前端知识管理数据分析Obsidian Dataview查询示例大全100实用查询代码片段Obsidian Dataview查询示例大全100实用查询代码片段 一、基础查询入门 1.1 核心查询类型概览 Obsidian Dataview提供四种前端知识管理数据分析上一篇OpenObserve UI 架构师组件目录O2 组件库全量索引与场景选型指南下一篇10分钟出EFI配置用OpCore Simplify搭建黑苹果创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表