collections.Where
Syntax
collections.Where COLLECTION KEY [OPERATOR] MATCH
Returns
any
Alias
where
where 过滤一个数组,只保留包含给定字段匹配值的元素。
它的工作方式类似于 SQL 中的 where 关键字。
{{ range where .Pages "Section" "foo" }}
{{ .Content }}
{{ end }}
可以通过使用点语法将第二个参数链式连接,以引用嵌套元素的值。
---
series: golang
title: 例子
---+++
series = 'golang'
title = '例子'
+++{
"series": "golang",
"title": "例子"
}
{{ range where .Site.Pages "Params.series" "golang" }}
{{ .Content }}
{{ end }}
也可以与逻辑运算符 !=、>=、in 等一起使用。如果没有指定运算符,where 将使用等于号进行比较。
{{ range where .Pages "Section" "!=" "foo" }}
{{ .Content }}
{{ end }}
where 支持以下逻辑运算符:
=,==,eq- 当给定字段的值等于匹配值时为
true !=,<>,ne- 当给定字段的值不等于匹配值时为
true >=,ge- 当给定字段的值大于或等于匹配值时为
true >,gt- 当给定字段的值大于匹配值时为
true <=,le- 当给定字段的值小于或等于匹配值时为
true <,lt- 当给定字段的值小于匹配值时为
true in- 当给定字段的值在匹配值中存在时为
true;匹配值必须是一个数组或切片 not in- 当给定字段的值不在匹配值中存在时为
true;匹配值必须是一个数组或切片 intersect- 当给定字段的值(为一个字符串或整数的数组或切片)与匹配值有共同的元素时为
true;遵循与intersect函数 相同的规则 like- 当给定字段的值与正则表达式匹配时为
true。like操作符用于比较string值。比较其他数据类型与正则表达式时,将返回false。
使用布尔值进行 where 筛选
使用布尔值时,请不要添加引号。
{{ range where .Pages "Draft" true }}
<p>{{ .Title }}</p>
{{ end }}
使用 where 与 intersect
{{ range where .Site.Pages "Params.tags" "intersect" .Params.tags }}
{{ if ne .Permalink $.Permalink }}
{{ .Render "summary" }}
{{ end }}
{{ end }}
还可以将 where 子句的返回值保存在变量中:
{{ $v1 := where .Site.Pages "Params.a" "v1" }}
{{ $v2 := where .Site.Pages "Params.b" "v2" }}
{{ $filtered := $v1 | intersect $v2 }}
{{ range $filtered }}
{{ end }}
使用 where 与 like
这个例子匹配以 “ab” 开头的 “foo” 参数相同的页面:
{{ range where site.RegularPages "Params.foo" "like" `^ab` }}
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
{{ end }}
在指定正则表达式时,使用原生的字符串字面量(反引号)而不是解释的字符串字面量(双引号),以简化语法。使用解释的字符串字面量时,必须转义反斜杠。
Go的正则表达式包实现了RE2语法。RE2语法可以理解为对PCRE所接受的语法进行了子集化,并带有一些注意事项。注意,RE2 \C转义序列不受支持。
使用 where 与 first
将 first 与 where 结合使用可以非常强大。下面的示例从主要章节中获取帖子列表,并使用列表的默认排序(即 weight => date),然后遍历该列表中的前 5 个帖子:
{{ range first 5 (where site.RegularPages "Type" "in" site.Params.mainSections) }}
{{ .Content }}
{{ end }}
嵌套 where 子句
可以嵌套 where 子句以通过多个参数对内容列表进行进一步筛选。下面的示例首先获取 “blog” 部分的所有页面,然后在第一个 where 子句的结果中遍历,找到所有未被标记为{:.noconvert}特色的页面:
{{ range where (where .Pages "Section" "blog" ) "Params.featured" "!=" true }}
未设置字段
筛选仅适用于已设置的字段。如果要检查字段是否已设置或存在,可以使用操作数 nil。
这在从大型池中筛选少量页面时非常有用。您可以仅在必要的页面上设置字段,而不是在所有页面上设置字段。
针对 nil,只有以下运算符可用:
=,==,eq:当给定字段未设置时为true。!=,<>,ne:当给定字段已设置时为true。
{{ range where .Pages "Params.specialpost" "!=" nil }}
{{ .Content }}
{{ end }}
便携的 where 筛选器 – site.Params.mainSections
这对于主题来说尤为重要。
在首页或类似页面上列出最相关的页面时,应使用 site.Params.mainSections 列表,而不是将节名称与硬编码的值(如 "posts" 或 "post")进行比较。
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
如果用户没有在站点配置中设置此参数,它将默认为页面最多的节。
用户可以更改默认值:
params:
mainSections:
- blog
- docs
[params]
mainSections = ['blog', 'docs']
{
"params": {
"mainSections": [
"blog",
"docs"
]
}
}