Loving Tina? us on GitHub0.0k

文档

学习

v.Latest
Documentation
常见查询
目录

介绍

数据获取介绍中所述,Tina 提供了一个用于查询内容的客户端。

注意,对于高级用例,您还可以手动查询底层的 GraphQL API

查询单个文档

import { client } from '../[pathToTina]/tina/__generated__/client';
const myPost = await client.queries.post({ relativePath: 'HelloWorld.md' });
console.log(myPost.title);

在上面的例子中,post 是正在查询的集合的名称。可以用您架构中定义的集合名称之一替换它。

查询文档列表

const postsResponse = await client.queries.postConnection();
const posts = postsResponse.data.postConnection.edges.map((post) => {
return { slug: post.node._sys.filename };
});
// 这将返回一个数组,如:[ { slug: 'HelloWorld.md'}, /*...*/ ]

<collection-name>Connection 可用于查询文档列表(在上面的例子中,我们的集合名称是 post)。

过滤

可以将过滤器作为选项添加到 <collection-name>Collection 查询中。

const postsResponse = await client.queries.postConnection({
filter: { title: { startsWith: 'Vote' } },
});
// ...

以下操作符类型可用于查询

行为

类型

eq

等于

string, number, boolean

in

其中之一

string[], number[], boolean[]

gt

大于

string, number

gte

大于或等于

string, number

lt

小于

string, number

lte

小于或等于

string, number

startsWith

以...开始

string

after

之后

datetime

before

之前

datetime

只有 gtgteltlteafterbefore 可以用于三元条件。
按文件名(_sys)过滤

目前,按文件名过滤文档的唯一方法是通过代码过滤现有的文档集合。

例如,要过滤一个帖子数组以仅包含名为 file-name-i-want 的文件,可以使用以下代码:

const allPosts = posts?.data?.postConnection?.edges.filter(
(post) => post.node._sys.filename === 'file-name-i-want'
);
注意:使用自动生成的 <collection-name>Connection 时,查询将仅应用于文档的字段,而不是 _sys 属性。如上所示的代码过滤是一个合适的替代方案。

排序

可以将排序作为选项添加到 <collection-name>Collection 查询中。

const postsResponse = await client.queries.postConnection({
sort: 'date',
});
// ...
按多个字段排序

这里我们将使用 postConnection 查询我们的帖子集合,并使用名为 category-date 的多字段索引首先按类别排序,然后按日期排序结果:

const postsResponse = await client.queries.postConnection({
sort: 'category-date',
});
// ...

分页

Tina 支持基于游标的分页:

const postsResponse = await client.queries.postConnection({
first: 10,
after:
'cG9zdCNkYXRlIzE2NTUyNzY0MDAwMDAjY29udGVudC9wb3N0cy92b3RlRm9yUGVkcm8uanNvbg==',
});
// ...

在客户端使用内置查询的一个注意事项是您一次只能查询一个根集合。如果您有一个页面上有多个表单,您可能需要使用自定义查询

上次编辑: May 1, 2025