See*_*V P 5 graphql graphql-js apollo-server
我想在Apollo graphql server中实现基于游标的分页.我已经准备了具有分页要求的模式.但我被困在解决方案方面.这是我的架构
const typeDefinitions = `
input CreateDeveloperInput {
# An arbitrary string value with no semantic meaning. Will be included in the
# payload verbatim. May be used to track mutations by the client.
clientMutationId: String
developer: DeveloperInput!
}
type CreateDeveloperPayload {
clientMutationId: String
developerEdge(orderBy: DevelopersOrderBy = PRIMARY_KEY_ASC): DevelopersEdge
query: Query
}
input DeleteDeveloperByIdInput {
# An arbitrary string value with no semantic meaning. Will be included in the
# payload verbatim. May be used to track mutations by the client.
clientMutationId: String
id: Int!
}
input DeleteDeveloperInput {
clientMutationId: String
nodeId: ID!
}
type DeleteDeveloperPayload {
clientMutationId: String
developer: Developer
deletedDeveloperId: ID
# Our root query field type. Allows us to run any query from our mutation payload.
query: Query
}
type Developer implements Node {
nodeId: ID!
id: Int!
name: String!
place: String
salary: Int
joiningDate: String
}
input DeveloperCondition {
id: Int
name: String
place: String
salary: Int
joiningDate: String
}
input DeveloperInput {
id: Int
name: String!
place: String
salary: Int
joiningDate: String
}
input DeveloperPatch {
id: Int
name: String
place: String
salary: Int
joiningDate: String
}
type DevelopersConnection {
# Information to aid in pagination.
pageInfo: PageInfo!
totalCount: Int
edges: [DevelopersEdge]
nodes: [Developer!]
}
type DevelopersEdge {
# A cursor for use in pagination.
cursor: String
node: Developer!
}
enum DevelopersOrderBy {
PRIMARY_KEY_ASC
PRIMARY_KEY_DESC
NATURAL
ID_ASC
ID_DESC
NAME_ASC
NAME_DESC
PLACE_ASC
PLACE_DESC
SALARY_ASC
SALARY_DESC
JOINING_DATE_ASC
JOINING_DATE_DESC
}
# The root mutation type which contains root level fields which mutate data.
interface Node {
# A globally unique identifier. Can be used in various places throughout the system to identify this single value.
nodeId: ID!
}
# Information about pagination in a connection.
type PageInfo {
# When paginating forwards, are there more items?
hasNextPage: Boolean!
# When paginating backwards, are there more items?
hasPreviousPage: Boolean!
# When paginating backwards, the cursor to continue.
startCursor: String
# When paginating forwards, the cursor to continue.
endCursor: String
}
# The root query type which gives access points into the data universe.
type Query implements Node {
allDevelopers(
# Read all values in the set before (above) this cursor.
before: String,
# Read all values in the set after (below) this cursor.
after: String, first: Int, last: Int, offset: Int,
# A condition to be used in determining which values should be returned by the collection.
condition: DeveloperCondition): DevelopersConnection
# Exposes the root query type nested one level down. This is helpful for Relay 1
# which can only query top level fields if they are in a particular form.
nodeId: ID!
}
schema {
query: Query
}
`;
export default [typeDefinitions];Run Code Online (Sandbox Code Playgroud)
解析器是否可以解决?如果是,请任何人告诉我如何实施它
小智 0
如果您将 Mongo 和 Mongoose 与 Apollo Express GraphQL 一起使用,我发现了三种进行分页的方法:
您可以cursor在架构上创建一个字段并使用分页逻辑实现解析器,但如果您有一个复杂的架构,其中包含联合、接口和类型上的不同嵌套对象,但如果您想实现自己做,这是参考
您可以使用一个模块来嵌套您的 Mongoose 模型并为您提供分页界面,但这需要对您的架构和解析器进行一些更改,比第三种方法需要更多的工作
您可以使用Mongo / Mongoose 中的sort,skip 和limit,但如果您自己执行此操作,您会发现一些问题,例如,如果文档按日期键排序,该日期键可以包含具有相同日期的不同文档,则可能会重复文档并弄乱你的分页,所以我建议你在 Mongoose 模式上安装一个分页插件,并像 Mongoose 中的任何其他方法一样使用它
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |