cassandra 如何在Astra DB中使用REST API进行过滤?

qyzbxkaa  于 2023-05-17  发布在  Cassandra
关注(0)|答案(2)|浏览(173)

目前,我在DataStax Astra中使用Rest API时遇到问题。
例如数据:

{
  "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"
    }]
}

现在,我想得到所有成员与角色回(后端).我尝试使用2个API相同的上述图像API但不成功。也许,我传递了不正确的输入或输入体到2 API。我搜索了论坛,但找不到解决方案。
任何答案都是赞赏的。
多谢了!

rwqw0loc

rwqw0loc1#

您的问题缺少关键细节,包括:
1.表模式,以及

  1. REST API查询。
    在任何情况下,您发布的结果集似乎都被“篡改”了,因为它报告了"count": 2,但列表中有3条记录,其中"id": "180"重复。
    因此,我将使用一个示例来说明如何对字段进行筛选。下面是我在DB中创建的表:
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}}

REST API调用的结果请求URL(带有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调用:

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

将返回一个错误400,因为role不是分区键,所以我们不能过滤它:

{
  "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"
    }
  ]
}

有关详细信息和更多示例,请参见Developing with the Astra DB REST API。干杯!

xkftehaa

xkftehaa2#

如果您直接处理JSON类型的数据/有效负载,则可以利用Document 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的示例,该资源将随时更新最新信息。

相关问题