我无法理解如何在GatsbyJS中为GraphQL查询编写过滤器。
这有效:
filter: { contentType: { in: ["post", "page"] }
我基本上需要相反的操作,例如:
filter: { "post" in: { contentTypes } } // where contentTypes is array
这不起作用,因为“期望名称”(在我的示例中为“ post”)。
经过GatsbyJS docs之后,我发现了这一点:
elemMatch: short for element match, this indicates that the field you are filtering will return an array of elements, on which you can apply a filter using the previous operators
filter:{
packageJson:{
dependencies:{
elemMatch:{
name:{
eq:"chokidar"
}
}
}
}
}
太好了!那就是我所需要的!所以我尝试了,然后得到了
error GraphQL Error Field "elemMatch" is not defined by type markdownRemarkConnectionFrontmatterTagsQueryList_2.
在markdownRemarkConnectionFrontmatterTagsQueryList_2中定义的关键字是:
当文档中提到更多elemMatch
之类的关键字时,为什么我仅限于这些关键字?为什么不允许使用过滤器结构“ element in:{array}”?
如何创建此过滤器?
答案 0 :(得分:1)
假设您有一个降价博客,其中categories
为字符串数组,您可以像这样在categories
中过滤带有“ historical”的帖子:
{
allMarkdownRemark(filter:{
frontmatter:{
categories: {
in: ["historical"]
}
}
}) {
edges {
node {
id
frontmatter {
categories
}
}
}
}
}
您可以在Gatsby.js docs中的任何graphiq块中尝试此查询。
我认为elemMatch
仅对具有对象数组的字段“打开”;类似于comments: [{ id: "1", content: "" }, { id: "2", content: ""}]
。这样,您可以在每个comment
的字段上应用进一步的过滤器:
comments: { elemMatch: { id: { eq: "1" } } }
这是一个示例,您可以在gatsby文档的graphiq块中进行尝试:
// only show plugins which have "@babel/runtime" as a dependency
{
allSitePlugin (filter:{
packageJson:{
dependencies: {
elemMatch: {
name: {
eq: "@babel/runtime"
}
}
}
}
}) {
edges {
node {
name
version
packageJson {
dependencies {
name
}
}
}
}
}
}