按盖茨比和内容丰富的日期过滤

时间:2019-02-20 09:23:02

标签: graphql gatsby contentful

如何在盖茨比中按日期过滤?这些文档暗示了ltgt运算符,当我尝试使用它们时会出错。

1 个答案:

答案 0 :(得分:4)

在Gatsby中按日期过滤可能很棘手。许多API以JSON格式将日期以JSON格式发送为字符串-ISO8601格式。这意味着GraphQL还将日期也视为字符串。如果您希望对字符串相等性进行过滤,这很好,但是通常不希望按日期过滤。

一个常见的用例是过滤到过去或将来的日期。在大多数情况下,我们会与今天的日期进行某种less thanmore than比较。不幸的是,这不适用于GraphQL中的日期字符串。 ltgt运算符仅适用于数字,不适用于字符串。

幸运的是,这里有一个逃生舱口-setFieldsOnGraphQLNodeType。这使我们可以获取内容节点,并添加包含派生数据的自己的字段。我们可以获取日期字符串,并将其解析为时间戳记-一个数字。使用日期作为时间戳,graphql可以执行其操作,并允许ltgt过滤器。

让我们说我们正在写一个博客,以及对过去发布的帖子进行过滤的内容。我们可以在ContentModel中添加一个publishedAt日期时间字段,这将有助于我们的内容作者将来发布内容。我们可以过滤掉以后的帖子,直到将publishedAt从日期字符串转换为数字为止。

这是它的外观:

exports.setFieldsOnGraphQLNodeType = ({ type }) => {
  if (type.name === `ContentfulBlogPost`) {
    return {
      publishAtTimestamp: {
        type: GraphQLFloat,
        resolve: source => {
          return new Date(source.publishAt).getTime(); 
        }
     }
   };
  }

  // by default return empty object
  return {};
};

ContentfulBlogPost现在具有一个新字段publishedAtTimestamp,它是一个数字,这意味着您现在可以使用ltgt

对其进行过滤
  query {
    allContentfulBlogPost(
      filter: { publishedAtTimestamp: { lt: $SOME_TIMESTAMP } }
    ) {
      edges {
        node {
          id
          ...otherFields
        }
      }
    }
  }