GraphQL 和 MongoDB 游标

Posted

技术标签:

【中文标题】GraphQL 和 MongoDB 游标【英文标题】:GraphQL & MongoDB cursors 【发布时间】:2016-11-21 12:49:57 【问题描述】:

我对 GraphQL 的游标和 MongoDB 的游标之间应该是什么关系感到困惑。

我目前正在研究创建对象(mongo 文档)并将其添加到现有连接(mongo 集合)的突变。添加对象时,突变返回添加的边缘。应该是这样的:


  node,
  cursor

虽然节点是实际添加的文档,但我对应该作为光标返回的内容感到困惑。

这是我的突变:

const CreatePollMutation = mutationWithClientMutationId(
  name: 'CreatePoll',

  inputFields: 
    title: 
      type: new GraphQLNonNull(GraphQLString),
    ,
    multi: 
      type: GraphQLBoolean,
    ,
    options: 
      type: new GraphQLNonNull(new GraphQLList(GraphQLString)),
    ,
    author: 
      type: new GraphQLNonNull(GraphQLID),
    ,
  ,

  outputFields: 
    pollEdge: 
      type: pollEdgeType,
      resolve: (poll => (
        
          // cursorForObjectInConnection was used when I've tested using mock JSON data, 
          // this doesn't work now since db.getPolls() is async
          cursor: cursorForObjectInConnection(db.getPolls(), poll), 
          node: poll,
        
      )),
    ,
  ,

  mutateAndGetPayload: ( title, multi, options, author ) => 
    const  id: authorId  = fromGlobalId(author);
    return db.createPoll(title, options, authorId, multi); //promise
  ,

);

谢谢!

【问题讨论】:

【参考方案1】:

对你来说可能有点晚了,但也许它会帮助其他人遇到这个问题。

只需从您的 resolve 方法返回一个承诺。然后,您可以使用实际的 polls 数组创建光标。像这样:

resolve: (poll =>
    return db.getPolls().then(polls => 
        return  cursor: cursorForObjectInConnection(polls, poll), node: poll 
    )
)

但要小心,你的pollpolls 中的对象现在有不同的起源,并不严格相等。由于cursorForObjectInConnection 使用javascriptindexOf,您的光标可能最终会变成null。为了防止这种情况,您应该自己找到对象索引并使用offsetToCursor 来构造您的游标,如here 所述。

【讨论】:

以上是关于GraphQL 和 MongoDB 游标的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 进行基于 GraphQL 游标的分页 [关闭]

如何在 Relay 中管理游标和排序?

使用基于 GraphQL 游标的分页避免代码重复

在使用 graphql 缓存的基于游标的分页中跟踪页码

Github GraphQL API v.4.0 游标错误

MongoDB-5: 查询(游标操作游标信息)