Graphcool (Graphql): как сделать точный фильтр в массиве Id - PullRequest
0 голосов
/ 09 мая 2018

У меня есть модель чата

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 Ответ

0 голосов
/ 10 мая 2018

Суффикс every в users_every обеспечивает соответствие всех чатов, в которых есть только пользователи с идентификаторами из массива id_in. Вот почему вы получаете чаты с меньшим количеством пользователей, потому что подмножества совпадают.

Решение:

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 пользователей.

...