Obsidian Dataview查询异常:角色实体与文件名匹配问题
解决Obsidian Dataview中role.entity与this.file.name匹配失效的问题
问题场景
给[[Person1]]笔记的YAML前置元数据设置如下结构:
--- name: Person1 roles: - title: President entity: Entity1 from: 2022-04-20 to: 2024-02-19 - title: CEO entity: Entity2 from: 1996-05-15 to: 2022-04-20 ---
需要在[[Entity1]]笔记中列出所有关联Entity1的角色人员,直接用=运算符的查询无法生效:
TABLE WITHOUT ID file.link AS Persona, role.title AS Title, role.from AS From, role.to AS To, role.entity AS Entity FROM "" FLATTEN roles AS role WHERE role.entity = this.file.name
改用contains()函数的查询能运行,但会误显示关联Entity2的结果:
TABLE WITHOUT ID file.link AS Persona, role.title AS Title, role.from AS From, role.to AS To, role.entity AS Entity FROM "" FLATTEN roles AS role WHERE contains(role.entity, this.file.name)
已确认role.entity和this.file.name均为字符串类型,但=运算符匹配失效。
原因
this.file.name返回的是包含.md扩展名的完整文件名(比如Entity1.md),而YAML中role.entity的值是不含扩展名的纯名称(比如Entity1),两者无法完全匹配。contains()函数会忽略扩展名,只要字符串部分重叠就返回结果,因此会误匹配到类似Entity2的条目。
解决方案
方法1:使用this.file.basename(推荐)
Dataview提供了this.file.basename属性,直接返回不含扩展名的文件基础名称,用它做精确匹配:
TABLE WITHOUT ID file.link AS Persona, role.title AS Title, role.from AS From, role.to AS To, role.entity AS Entity FROM "" FLATTEN roles AS role WHERE role.entity = this.file.basename
方法2:手动去除扩展名
用replace()函数去掉this.file.name中的.md扩展名:
TABLE WITHOUT ID file.link AS Persona, role.title AS Title, role.from AS From, role.to AS To, role.entity AS Entity FROM "" FLATTEN roles AS role WHERE role.entity = replace(this.file.name, ".md", "")
两种方法都能实现精确匹配,避免误返回无关结果。
内容的提问来源于stack exchange,提问作者Xavier Tapia Gonzalez
相关产品推荐
相关产品推荐

