使用IN查询使用nodejs'cassandra-driver'准备好的查询

这是一个潜在的新手问题,但我无法在野外find答案。

我目前正在build立一个简单的用户事件日志这个表单(一些属性避免这个简单):

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); 

我想做一个准备好的查询来获取所有的事件,任意过滤一个给定的用户在几个小时的过程中理想的一套水平。

我可以轻松构build查询单个级别和小时的查询:

 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); }); 

这工作罚款一个小时和水平。 我很想在上面的查询中指定多个小时和级别,但是玩的代码我无法通过指定集作为一个string或值作为数组。

我想我被迫做这样的事情:

build立基于级别和小时数的查询是必要的:

 // 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); }); 

我不喜欢这个 但是,即使在这里,我仍然可以获得准备查询的好处,因为我们可以通过“准备:真”。 感觉应该有一个更好的方法…但我不知道我想要做什么甚至可能与一个准备好的查询。

任何人都可以在这里借一些智慧吗?

谢谢!

您应该使用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);