在 Gatsby 和 Contentful 中按日期过滤
Filtering by dates in Gatsby and Contentful
如何在 Gatsby 中按日期过滤?文档提到 lt
和 gt
运算符,我在尝试使用它们时遇到错误。
在 Gatsby 中按日期过滤可能很棘手。许多 API 将 JSON 中的日期作为字符串发送 - 采用 ISO8601 格式。这意味着 GraphQL 也会将日期视为字符串。如果您乐于按字符串相等性进行过滤,这很好,但通常您不希望按日期进行过滤。
一个常见的用例是筛选过去或未来的日期。在大多数情况下,我们会与今天的日期进行某种 less than
或 more than
的比较。不幸的是,这不适用于 GraphQL 中的日期字符串。 lt
和 gt
运算符仅适用于 数字 ,不适用于字符串。
幸运的是,有一个逃生口 - setFieldsOnGraphQLNodeType
。这允许我们获取一个内容节点,并添加我们自己的带有派生数据的字段。我们可以获取一个日期字符串,并将其解析为时间戳 - 一个数字。使用日期作为时间戳,graphql 可以做它的事情并允许 lt
和 gt
过滤器。
假设我们正在写一个博客,以及如何过滤过去发布的帖子。我们可以在我们的 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
,它是一个数字,这意味着您现在可以使用 lt
或 gt
对其进行过滤
query {
allContentfulBlogPost(
filter: { publishedAtTimestamp: { lt: $SOME_TIMESTAMP } }
) {
edges {
node {
id
...otherFields
}
}
}
}
如何在 Gatsby 中按日期过滤?文档提到 lt
和 gt
运算符,我在尝试使用它们时遇到错误。
在 Gatsby 中按日期过滤可能很棘手。许多 API 将 JSON 中的日期作为字符串发送 - 采用 ISO8601 格式。这意味着 GraphQL 也会将日期视为字符串。如果您乐于按字符串相等性进行过滤,这很好,但通常您不希望按日期进行过滤。
一个常见的用例是筛选过去或未来的日期。在大多数情况下,我们会与今天的日期进行某种 less than
或 more than
的比较。不幸的是,这不适用于 GraphQL 中的日期字符串。 lt
和 gt
运算符仅适用于 数字 ,不适用于字符串。
幸运的是,有一个逃生口 - setFieldsOnGraphQLNodeType
。这允许我们获取一个内容节点,并添加我们自己的带有派生数据的字段。我们可以获取一个日期字符串,并将其解析为时间戳 - 一个数字。使用日期作为时间戳,graphql 可以做它的事情并允许 lt
和 gt
过滤器。
假设我们正在写一个博客,以及如何过滤过去发布的帖子。我们可以在我们的 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
,它是一个数字,这意味着您现在可以使用 lt
或 gt
query {
allContentfulBlogPost(
filter: { publishedAtTimestamp: { lt: $SOME_TIMESTAMP } }
) {
edges {
node {
id
...otherFields
}
}
}
}