Как фильтровать с помощью REST API в Astra DB?

В настоящее время у меня возникла проблема при использовании Rest API в DataStax Astra.

Например данные:

      {
  "count": 2,
  "Members": [
    {
      "created_at": "",
      "intfield": null,
      "id": "294",
      "role": "BA",
      "username": "Join"
    },
    {
      "created_at": "",
      "intfield": null,
      "id": "180",
      "role": "Back",
      "username": "Kien Nguyen"
    },
    {
      "created_at": "",
      "intfield": null,
      "id": "180",
      "role": "Back",
      "username": "Kien Nguyen"
    }]
}

Теперь я хочу получить всех участников с ролью Back (backend). Я пытаюсь использовать 2 API, такие же, как API изображения выше, но безуспешно. Возможно, я передал неправильный ввод или тело ввода в API 2. Я искал по форумам, но не нашел решения.

Любой ответ приветствуется.

Большое спасибо!

2 ответа

В вашем вопросе отсутствуют важные детали, в том числе:

  1. схему таблицы и
  2. запрос REST API.

В любом случае опубликованный вами набор результатов, похоже, был «подделан», поскольку сообщает"count": 2но в списке 3 записи, причем"id": "180"дублируется.

Вместо этого я собираюсь использовать пример, чтобы проиллюстрировать, как фильтровать поле. Вот таблица, которую я создал в своей БД:

      CREATE TABLE community.members (
    id int PRIMARY KEY,
    name text,
    role text
)

Он заполняется следующими примерами данных:

       id  | name   | role
-----+--------+----------
 123 |  alice |  backend
 456 |    bob |  backend
 789 | charli | frontend

Чтобы фильтровать поid = 123, мы будем использовать следующее:

  • конечная точка -/api/rest/v2/keyspaces/community/members
  • фильтр -where={"id": {"$eq":123}}

Результирующий URL-адрес запроса для вызова REST API (с экранированными символами URL-адреса):

      https://*.apps.astra.datastax.com/api/rest/v2/keyspaces/community/members?where=%7B%22id%22%3A%20%7B%22%24eq%22%3A123%7D%7D

и ответ:

      {
  "count": 1,
  "data": [
    {
      "name": "alice",
      "id": 123,
      "role": "backend"
    }
  ]
}

Если я попытаюсь фильтровать с помощьюrole = 'backend'(илиwhere={"role": {"$eq":"backend"}}), этот вызов REST API:


вернет ошибку400потому что это не ключ раздела, поэтому мы не можем фильтровать по нему:

      {
  "description": "Bad request: org.apache.cassandra.stargate.exceptions.InvalidRequestException: \
    Cannot execute this query as it might involve data filtering and thus may have \
    unpredictable performance. If you want to execute this query despite the \
    performance unpredictability, use ALLOW FILTERING",
  "code": 400
}

Обходной путь — индексироватьroleстолбец, чтобы мы могли фильтровать по нему:

      CREATE INDEX ON community.members (role);

Теперь мы можем запросить его с помощью этого вызова REST API:

      https://*.apps.astra.datastax.com/api/rest/v2/keyspaces/community/members?where=%7B%22role%22%3A%20%7B%22%24eq%22%3A%22backend%22%7D%7D

получить:

      {
  "count": 2,
  "data": [
    {
      "name": "alice",
      "id": 123,
      "role": "backend"
    },
    {
      "name": "bob",
      "id": 456,
      "role": "backend"
    }
  ]
}

Подробности и еще несколько примеров см. в разделе « Разработка с использованием REST API Astra DB ». Ваше здоровье!

Если вы имеете дело непосредственно с данными/полезной нагрузкой типа JSON, вы можете использовать API документов , а не REST API.

Вот как можно добиться этого с помощью JSON/Document API:

      curl -L -X  GET 'https://$ASTRA_CLUSTER_ID-$ASTRA_REGION.apps.astra.datastax.com/api/rest/v2/namespaces/myworld/collections/members?where=\{"role":\{"$eq":"Back"\}\}' \
--header "X-Cassandra-Token: $ASTRA_DB_APPLICATION_TOKEN" \
--header 'Content-Type: application/json'

где, я предположилmyworldкак пространство имен иmembersв качестве названия коллекции.

Если вы обновите свой исходный вопрос фактической схемой таблицы и захотите получить другие указания с использованием других API, я соответствующим образом обновлю свой ответ. Ваше здоровье.

Бонус : здесь вы можете найти ресурсы коллекции Postman , которые содержат примеры всех доступных API, и этот ресурс будет постоянно обновляться последней информацией.

Другие вопросы по тегам