如何在 Gatsby 中根据其他字段删除 GraphQL 字段?

Posted

技术标签:

【中文标题】如何在 Gatsby 中根据其他字段删除 GraphQL 字段?【英文标题】:How to remove GraphQL fields according to other fields, in Gatsby? 【发布时间】:2021-10-13 06:42:23 【问题描述】:

我有一个返回视频播放列表的页面查询。有些视频将“公开”设置为 true,有些则设置为 false。对于公共字段设置为 false 的视频,我不想在 Gatsby 发送到页面的有效负载中包含该视频的 URL,因为访问这些视频是付费的。

例子:

export const query = graphql`
    query MyQuery 
        courses: allSanityCourses 
            nodes 
                price
                name
                playlist 
                    title
                    url
                    public
                
            
        
    
`

以及它返回的数据:

[
    
        "price": 149,
        "name": "Master VS Code",
        "playlist": [
            
                "title": "Intro",
                "url": "https://youtu.be/qwertyuiop",
                "public": true
            ,
            
                "title": "Principles Part 1",
                "url": "https://youtu.be/poiuytrewq",
                "public": false
            
        ]
    
]

如何防止 Gatsby 将第二个 URL(将 public 设置为 false)发送到页面?

我不确定Query Filters 是否有效,因为它们似乎只允许根据相同字段的内容过滤/删除字段。我需要的是根据 another 同级字段“public”过滤/删除 URL 字段。

【问题讨论】:

【参考方案1】:

我想你正在寻找:

export const query = graphql`
    query MyQuery 
        courses: allSanityCourses(
        filter: 
          playlist: 
            public:  eq: true 
          
        ,
        )
            nodes 
                price
                name
                playlist 
                    title
                    url
                    public
                
            
        
    
`

filter 过滤器(相当多余)和eq(等于)选项应该可以为您解决问题。如果需要,请在 localhost:8000/___graphql 操场上检查它。

您可以在https://www.gatsbyjs.com/docs/query-filters/中查看更多过滤器

【讨论】:

我用查询 MyQuery course: allSanityCourses( filter: playlist: elemMatch: public: eq: true , ) nodes price title playlist title url public 并且它仍然返回所有播放列表元素,包括 public: false 。 我解决了它here,但如果我能用 GraphQL 本身做到这一点,那就更好了。 你试过我的吗? (eq 代替 elemMatch) 是的,对不起,我忘了告诉你它导致了一个错误:字段“public”不是由类型“SanityVideoFilterListInput”定义的。 那你没有过滤allSanityCourses节点

以上是关于如何在 Gatsby 中根据其他字段删除 GraphQL 字段?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项

Objective C如何根据其他数组项从数组中删除项

“无法读取未定义的属性‘节点’” - Gatsby/GraphQL/Prismic

Gatsby Remark 插件:创建的节点对 GraphIQL 可见,但在 Gatsby 页面上的查询返回 null

如何将 JSON 字段添加到 Gatsby sourceNode?

如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个