如何修改Obsidian的DataviewJS查询以筛选标签并排除特定标签?
修改后的DataviewJS 内联查询代码
直接用 !p.file.tags.includes("tag3") 来排除包含tag3的笔记,完整查询如下:
$= dv.list(dv.pages().where(p => p.file.tags.includes("tag1") && p.file.tags.includes("tag2") && !p.file.tags.includes("tag3")).file.link)
逻辑说明:
p.file.tags.includes("tag1") && p.file.tags.includes("tag2"):筛选同时包含tag1和tag2的笔记!p.file.tags.includes("tag3"):排除包含tag3的笔记
关于p.file.tags的属性与判断方法
- 本质类型:
p.file.tags是一个字符串数组,存储了当前笔记所有关联的标签(包括YAML frontmatter里的tags和正文中的#标签)。 - 可用方法:可以直接使用JavaScript数组的原生方法,常用的有:
includes("标签名"):判断数组是否包含指定标签,返回true/falseindexOf("标签名"):返回标签在数组中的索引位置,不存在则返回-1length:获取当前笔记的标签总数filter():按条件过滤标签数组
- “不包含”的实现:JavaScript数组没有原生的
notincludes方法,但可以用!p.file.tags.includes("标签名")来实现“不包含指定标签”的判断逻辑,这是最简洁直接的写法。
注意:如果你的标签在
p.file.tags中是带#前缀的格式(比如#tag1),需要把代码中的标签名改成带#的形式,比如p.file.tags.includes("#tag1")。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

