使用 nodejs 'cassandra-driver' 准备查询和 IN 查询
Using nodejs 'cassandra-driver' prepared query with IN query
这是一个潜在的新手问题,但我在野外找不到答案。
我目前正在构建一个这种形式的简单用户事件日志(为了简单起见省略了一些属性):
CREATE TABLE events.by_hour (
level tinyint, /* 60 = FATAL, 10 = TRACE */
hour int, /* in YYYYMMDDHH format */
insertion_time timeuuid,
userid TEXT,
message TEXT,
PRIMARY KEY ((type,hour),userid,insertion_time))
WITH CLUSTERING ORDER BY (userid ASC, insertion_time ASC);
我想做一个准备好的查询来获取给定用户在某些级别上选择性过滤的所有事件,理想情况下是在几个小时内。
我可以轻松构建查询单个级别和小时的查询:
var cassandra = require('cassandra-driver');
var client = new cassandra.Client({contactPoints: ['127.0.0.1']});
var query
= 'SELECT * FROM events.by_hour
WHERE level IN (?) and hour IN (?) and userid = ?;';
var options = [ 10, 2016032117,'user_uuid' ];
client.execute(query, options, {
prepare: true
}, function (err, result) {
// Do stuff...
next(err);
});
这适用于一个小时和一个级别。我很想在上面的查询中指定多个小时和级别,但是使用代码我无法通过将集合指定为字符串或值数组来使其工作。
我想我被迫做这样的事情:
根据需要的级别数和小时数构建查询:
// for 1 level and 2 hours:
query = 'SELECT * FROM events.by_hour
WHERE level IN (?) and hour IN (?,?) and userid = ?;';
options = [ 10, 2016032117,2016032118,'user_uuid' ];
client.execute(query, options, {
prepare: true
}, function (err, result) {
// Do stuff...
next(err);
});
// for 2 levels and 2 hours:
query = 'SELECT * FROM events.by_hour
WHERE level IN (?,?) and hour IN (?,?) and userid = ?;';
options = [ 10, 20, 2016032117,2016032118,'user_uuid' ];
client.execute(query, options, {
prepare: true
}, function (err, result) {
// Do stuff...
next(err);
});
我不喜欢这个。但是即使在这里我仍然可以获得准备好的查询的好处,因为我们可以传入 'prepared: true'。感觉应该有更好的方法......但我不确定我正在尝试做的事情甚至可以通过单个准备好的查询实现。
任何人都可以在这里提供一些智慧吗?
谢谢!
您应该使用 IN
运算符后跟查询标记(无括号),并以数组形式提供查询标记的参数:
const query = 'SELECT * FROM events.by_hour WHERE level IN ? and ' +
'hour IN ? and userid = ?';
const params = [ [ 10, 20, 30] , [ 2016032117, 2016032118 ],'user_uuid' ];
client.execute(query, params, { prepare: true }, callback);
这是一个潜在的新手问题,但我在野外找不到答案。
我目前正在构建一个这种形式的简单用户事件日志(为了简单起见省略了一些属性):
CREATE TABLE events.by_hour (
level tinyint, /* 60 = FATAL, 10 = TRACE */
hour int, /* in YYYYMMDDHH format */
insertion_time timeuuid,
userid TEXT,
message TEXT,
PRIMARY KEY ((type,hour),userid,insertion_time))
WITH CLUSTERING ORDER BY (userid ASC, insertion_time ASC);
我想做一个准备好的查询来获取给定用户在某些级别上选择性过滤的所有事件,理想情况下是在几个小时内。
我可以轻松构建查询单个级别和小时的查询:
var cassandra = require('cassandra-driver');
var client = new cassandra.Client({contactPoints: ['127.0.0.1']});
var query
= 'SELECT * FROM events.by_hour
WHERE level IN (?) and hour IN (?) and userid = ?;';
var options = [ 10, 2016032117,'user_uuid' ];
client.execute(query, options, {
prepare: true
}, function (err, result) {
// Do stuff...
next(err);
});
这适用于一个小时和一个级别。我很想在上面的查询中指定多个小时和级别,但是使用代码我无法通过将集合指定为字符串或值数组来使其工作。
我想我被迫做这样的事情:
根据需要的级别数和小时数构建查询:
// for 1 level and 2 hours:
query = 'SELECT * FROM events.by_hour
WHERE level IN (?) and hour IN (?,?) and userid = ?;';
options = [ 10, 2016032117,2016032118,'user_uuid' ];
client.execute(query, options, {
prepare: true
}, function (err, result) {
// Do stuff...
next(err);
});
// for 2 levels and 2 hours:
query = 'SELECT * FROM events.by_hour
WHERE level IN (?,?) and hour IN (?,?) and userid = ?;';
options = [ 10, 20, 2016032117,2016032118,'user_uuid' ];
client.execute(query, options, {
prepare: true
}, function (err, result) {
// Do stuff...
next(err);
});
我不喜欢这个。但是即使在这里我仍然可以获得准备好的查询的好处,因为我们可以传入 'prepared: true'。感觉应该有更好的方法......但我不确定我正在尝试做的事情甚至可以通过单个准备好的查询实现。
任何人都可以在这里提供一些智慧吗?
谢谢!
您应该使用 IN
运算符后跟查询标记(无括号),并以数组形式提供查询标记的参数:
const query = 'SELECT * FROM events.by_hour WHERE level IN ? and ' +
'hour IN ? and userid = ?';
const params = [ [ 10, 20, 30] , [ 2016032117, 2016032118 ],'user_uuid' ];
client.execute(query, params, { prepare: true }, callback);