Как фильтровать с помощью 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 ответа
В вашем вопросе отсутствуют важные детали, в том числе:
- схему таблицы и
- запрос 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, и этот ресурс будет постоянно обновляться последней информацией.