Не получает количество в соответствии с фильтром в расширенных запросах GraphQL

#graphql #amazon-dynamodb #aws-amplify #aws-appsync #aws-amplify-cli

#graphql #amazon-dynamodb #aws-amplify #aws-appsync #aws-amplify-cli

Вопрос:

Получение количества отсканированных, но не количества данных в соответствии с фильтром

 count: null
items: [{id: "bcd75096-7fd9-4e9d-8675-6877f0609ac2", name: "dxfrdhjkhklklkl", description: "dgdxrfg",…},…]
0: {id: "bcd75096-7fd9-4e9d-8675-6877f0609ac2", name: "dxfrdhjkhklklkl", description: "dgdxrfg",…}
1: {id: "52f6ff60-fc07-4631-a1fb-b039f376ff21", name: "ghnfgyhj", description: "gyhkjmuhjolk",…}
2: {id: "f73dfb37-2778-4b87-88c7-e6f9f5b5c931", name: "drftgserty", description: "trse54rte54ty",…}
3: {id: "6df9f5c2-ec06-4e70-b5e2-133cb0d8e958", name: "tygujghukuh", description: "tuyjyuikuolnh",…}
4: {id: "9360a766-ac89-420c-881b-2b3089bcca7f", name: "kl;", description: "vcbghnjmk,l", is_active: true,…}
5: {id: "c0dcbaff-37d4-4e4c-9375-584ff7110d77", name: "dfhgbdcb", description: "dfxvcx", is_active: true,…},...
scannedCount: 100
  

Я следовал этим руководствам, чтобы подсчитать, КАК ПОДСЧИТАТЬ КОЛИЧЕСТВО РЕЗУЛЬТАТОВ С ПОМОЩЬЮ AWS AMPLIFY DYNAMODB И GRAPHQL

Фильтр

       var body = {
        filter: {
          is_active: {
            eq: true
          }
        }
      }
  

Запрос для получения списка задач

 export const listTodos = /* GraphQL */ `
  query ListTodos(
    $filter: ModelTodoFilterInput
    $limit: Int
    $nextToken: String
  ) {
    listTodos(filter: $filter, limit: $limit, nextToken: $nextToken) {
      count
      items {
        id
        name
        description
        is_active
        createdAt
        updatedAt
      }
      scannedCount
    }
  }
`;
  

GraphQL shema

 type Todo @model {
  id: ID!
  name: String!
  description: String!
  is_active: Boolean
}

type ModelTodoConnection {
  items: [Todo]
  scannedCount: Int
  count: Int
  total: Int
}
  

И ЕСЛИ я установлю ограничение на 5, и оно отправит обратно scannedCount 5, если у меня будет общее количество данных в базе данных около 110. Я хочу подсчитать данные, где is_active: { eq: true }

Комментарии:

1. Можете ли вы поделиться своей схемой graphql?

2. я обновил его

3. Я не думаю, что DynamoDB способен предоставлять точные подсчеты результатов для запросов GraphQL. Ссылка: проблема с общим количеством запросов GraphQL в репозитории Amplify CLI GitHub. Я также думаю, что оба запроса DynamoDB. Документация по подсчету и ссылка на сообщение в блоге вводят в заблуждение в этом вопросе.

4. Я пытаюсь получить решение за последние 4 дня, но ничего не получил

5. Да, я понимаю, почему. Чем больше я читаю об этом, тем больше кажется, что подсчет результатов запроса GraphQL является нерешенной проблемой DynamoDB. Поэтому я не думаю, что для этой проблемы существует готовое решение. Тем не менее, в ветке проблем есть несколько предложений, которые, возможно, стоит попробовать, если подсчет результатов запроса GraphQL является обязательным требованием.

Ответ №1:

Ознакомьтесь с пакетом, который я написал для решения этой проблемы: https://github.com/multimeric/AmplifyCountDirective .

После выполнения инструкций по установке, чтобы решить вашу проблему, я бы изменил схему на эту:

 type Todo @model @count {
  id: ID!
  name: String!
  description: String!
  is_active: Boolean
}
  

Затем вы можете запросить количество, используя запрос GraphQL, такой как:

 {
    countTodo(filter: {
        is_active: {
            eq: true
        }
    })
}
  

Комментарии:

1. Извините, но я не понимаю … AppSync генерирует listTodo, вы можете вызвать его с любым фильтром и выводить только идентификационные номера. В приложении просто используйте length, и вы увидите общее количество.

2. Длина результирующего массива покажет вам только длину одной страницы данных. Этот пакет и его распознаватель вернут длину всей таблицы или запроса.

3. если вы не установили ограничение, вы получаете все страницы сразу.

4. Это не так. Если ваш набор данных превышает 1 МБ, он будет автоматически разбит на страницы DynamoDB. Есть причина, по которой этот поток привлекает такое внимание.