Graphcool(Graphql):如何在 Id 数组中进行精确过滤

Posted

技术标签:

【中文标题】Graphcool(Graphql):如何在 Id 数组中进行精确过滤【英文标题】:Graphcool (Graphql): how to make exact filter in array of Id 【发布时间】:2018-10-19 06:27:42 【问题描述】:

我有聊天模型

type Chat @model 
    id: ID! @isUnique
    name: String
    messages: [Message!]! @relation(name: "ChatMessages")
    users: [User!]! @relation(name: "ChatUser")
    createdAt: DateTime!

我创建了一个与两个人 ["123", "234"] 的聊天,一切正常。但是当我想与三个人创建一个新的群聊时,其中两个人已经和自己聊天["123", "234", "345"] 我查询一下这个聊天是否与三个人存在

query 
  allChats(filter:
    users_every: 
        id_in: ["123", "234", "345"]
        
      
  )
        id
        users
         id
        
      

我得到回复说这个聊天已经存在,但这里我只有两个用户,而不是全部


  "data": 
    "allChats": [
      
        "id": "cjgxuub2351uj0187qeil548m",
        "users": [
          
            "id": "123"
          ,
          
            "id": "234"
          
        ]
      
    ]
  

【问题讨论】:

【参考方案1】:

users_every 中的 every 后缀确保它匹配所有只有具有来自 id_in 数组的 id 的用户的聊天。这就是您与更少用户聊天的原因,因为子集匹配。

解决办法:

query 
  allChats(
    filter: 
      AND: [
         users_some:  id: "123"  ,
         users_some:  id: "234"  ,
         users_some:  id: "345"  ,
         users_every:  id_not_in: ["678", "910", ...]  
      ]
    
  ) 
    id
    users 
      id
    
  

users_some 过滤器确保选择至少包含所有这 3 个用户的聊天。需要users_every - id_not_in 来排除与这三个以及任何其他用户的聊天。

老实说,这对我来说似乎有点令人费解,对于拥有大量用户的应用来说可能有点不可行。我希望 graph.cool 在 api 中实现一些更简单的解决方案。

作为替代方案,您可以省略 users_every 过滤器,然后在您的客户端应用程序中,仅从结果中选择恰好具有 3 用户的聊天。

【讨论】:

以上是关于Graphcool(Graphql):如何在 Id 数组中进行精确过滤的主要内容,如果未能解决你的问题,请参考以下文章

graphql/graphcool:如何编写一个连接一对一和一对多关系的突变

在 Graphcool / GraphQL 中发布更新突变时如何“更新”数组/嵌套字段?

如何:在 GraphQL 中增加基于整数的字段的值

使用 *ngFor (angular + apollo + graphcool) 获取用户的帖子

GraphQL/GraphCool 为啥坐标不适用于 FLOAT?

订阅一个 GraphQL 项目