JSON 中某个字段的 Cassandra 查询
Cassandra query by a field in 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
}
}
]
现在我想根据userid检索记录:
SELECT JSON * FROM mytable WHERE userid = fromJson("1") // but this query throws error
所有这些都发生在 node/express 应用程序中,我使用 dse-driver 作为客户端驱动程序。
假设 user-id 是分区键,假设你想检索一个对应于 id 1 用户的 JSON 对象,你应该尝试:
SELECT JSON * FROM mytable WHERE userid=1;
如果userid是text类型,需要加引号。
CQL 命令如下所示,
SELECT JSON * 来自 mytable WHERE userid="1";
但是,如果它必须通过 dse-driver 执行,那么下面的代码片段有效,
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 的方法。使用 Cassandra-Python API
编写 python 脚本
这里你必须先获取你的行,然后使用python json的loads方法,这会将你的json文本列值转换为JSON对象这将是 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()
我正在使用最新的 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
}
}
]
现在我想根据userid检索记录:
SELECT JSON * FROM mytable WHERE userid = fromJson("1") // but this query throws error
所有这些都发生在 node/express 应用程序中,我使用 dse-driver 作为客户端驱动程序。
假设 user-id 是分区键,假设你想检索一个对应于 id 1 用户的 JSON 对象,你应该尝试:
SELECT JSON * FROM mytable WHERE userid=1;
如果userid是text类型,需要加引号。
CQL 命令如下所示,
SELECT JSON * 来自 mytable WHERE userid="1";
但是,如果它必须通过 dse-driver 执行,那么下面的代码片段有效,
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 的方法。使用 Cassandra-Python API
编写 python 脚本这里你必须先获取你的行,然后使用python json的loads方法,这会将你的json文本列值转换为JSON对象这将是 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()