2017-08-09 207 views
0

我想在GraphQL查询中指定内部约束,这会限制最外层查询的结果作为我正在处理的查询/谓词生成器的一部分。我不确定这是否被认为是在GraphQL的能力范围内,但对我而言,这是人们想要做的事情。使用GraphQL结构来构建复杂的数据库查询

例如,我可能想显示的博客帖子最近被评论这样的列表:

{ 
    posts{ 
    title 
    date 
    comments(since: $earliestDate){ 
     body 
     date 
     author { 
     name 
     } 
    } 
    } 
} 

这样做的正常行为将带回的所有博客文章,只评论说,会见标准。

{ 
    "posts": [ 
    { 
     "title": "Post 1", 
     "date": "2017-07-31" 
     "comments": [ 
     ] 
    }, 
    { 
     "title": "Post 2", 
     "date": "2017-06-10", 
     "comments": [ 
     { 
      "body": "Comment text", 
      "date": "2017-08-09", 
      "author": { 
      "name": "Michael" 
      } 
     } 
     ] 
    } 

    ] 
} 

但我想我的查询,以防止“后1”的检索,因为它在过去一个月没有意见,但我不知道这件事情GraphQL将很容易做到。

GraphQL中是否有支持返回此结果的功能?

{ 
    "posts": [ 
    { 
     "title": "Post 2", 
     "date": "2017-06-10", 
     "comments": [ 
     { 
      "body": "Comment text", 
      "date": "2017-08-09", 
      "author": { 
      "name": "Michael" 
      } 
     } 
     ] 
    } 

    ] 
} 

回答

2

TL; DR - 一般情况下,你想有一个字段的的行为只定义为:

  • 传递给现场
  • 对象身份的论点正被查询
  • 查询的全局上下文(例如,执行查询的用户的身份)

我认为你所追求的行为对于GraphQL并不是很理想。至少就我所见,GraphQL倾向于将字段视为相对独立(即使它们是嵌套的)。

例如,您不希望传递给子字段的参数更改其父项的行为。同样,我认为你不会期望存在缺席一个子字段来改变其父母的行为。

来完成你后的行为将是一个参数添加到岗位现场,表示只有与评论的帖子应该返回的最好办法:

{ 
    posts(withCommentsOnly: true) { 
    title 
    date 
    comments(since: $earliestDate) { 
     body 
     date 
     author { 
     name 
     } 
    } 
    } 
} 

要了解原因,只是想想这些种情景模式:

{ 
    authors { 
    id 
    posts { 
     comments { body } 
    } 
    } 
} 

如果该查询有您所描述的行为,每个作者,你只会得到posts其中也有comments。但是,假设您稍后再重新查询其中一个作者:

{ 
    node(id: "author_id") { 
    ... on Author { 
     posts { title } 
    } 
    } 
} 

现在您将获得一组不同的帖子吗?这种行为会让人们很难用标准的GraphQL客户端查询你的GraphQL模式,因为客户端缓存机制可能无法正确地更新他们的缓存。

+0

谢谢,这是一个非常明确和详细的答案。这正是我开始理解的内容,但我仍然想知道是否可以通过某种方式利用GraphQL来支持我的用例。我试图避免编写自己的自定义查询语言,看起来与GraphQL非常接近! –