Запрос Кассандры по полю в JSON

Я использую последнюю версию Cassandra и пытаюсь сохранить JSON, как показано ниже, и это было успешно,

INSERT INTO mytable JSON '{"username": "myname", "country": "mycountry", "userid": "1"}'

Выше запрос сохраняет запись как,

"rows": [
        {
            "[json]": "{\"userid\": \"1\", \"country\": \"india\", \"username\": \"sai\"}"
        }
    ],
    "rowLength": 1,
    "columns": [
        {
            "name": "[json]",
            "type": {
                "code": 13,
                "type": null
            }
        }
    ]

Теперь я хотел бы получить запись на основе идентификатора пользователя:

SELECT JSON * FROM mytable WHERE userid = fromJson("1") // but this query throws error

Все это происходит в приложении node/express, и я использую драйвер dse в качестве драйвера клиента.

3 ответа

Решение

Команда CQL работает, как показано ниже,

ВЫБЕРИТЕ JSON * ОТ mytable WHERE userid="1";

Однако, если это должно быть выполнено через драйвер dse, тогда работает приведенный ниже фрагмент,

let query = 'SELECT JSON * FROM mytable WHERE userid = ?';
client.execute(query, ["1"], { prepare: true });

где клиент,

const dse    = require('dse-driver');
const client = new dse.Client({ 
              contactPoints: ['h1', 'h2'],
              authProvider: new dse.auth.DsePlainTextAuthProvider('username', 'pass')
});

Если у вас версия Cassandra 2.1x и ниже, вы можете использовать подход на основе Python . Напишите скрипт Python с использованием Cassandra-Python API

Здесь вы должны сначала получить свою строку, а затем использовать метод загрузки json python, который преобразует значение вашего текстового столбца json в объект JSON, который будет dict в Python. Затем вы можете поиграть со словарями Python и извлечь необходимые вложенные ключи. См. Фрагмент кода ниже.

      from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
import json

if __name__ == '__main__':
   
    auth_provider = PlainTextAuthProvider(username='xxxx', password='xxxx')
    cluster = Cluster(['0.0.0.0'],
                      port=9042, auth_provider=auth_provider)
    session = cluster.connect("keyspace_name")
    print("session created successfully")
    rows = session.execute('select * from user limit 10')

    for user_row in rows:
        #fetchign your json column
        column_dict = json.loads(user_row.json_col)
        print(column_dict().keys()

Предполагая, что user-id является ключом раздела, и предполагая, что вы хотите получить объект JSON, соответствующий пользователю с идентификатором 1, вы должны попробовать:

 SELECT JSON * FROM mytable WHERE userid=1;

Если userid имеет тип text, вам нужно будет добавить несколько кавычек.

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