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

时间:2016-03-22 20:16:12

标签: node.js cassandra cqlsh nosql

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

我目前正在构建这个表单的简单用户事件日志(省略了一些属性以保持这一点):

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

这适用于一小时和一个级别。我希望在上面的查询中指定多个小时和级别,但是使用代码我无法通过将set指定为字符串或值数组来使其工作。

我想我不得不做这样的事情:

根据需要的级别数和小时数构建查询:

// 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'。感觉应该有一个更好的方式...但我不确定我想要做什么甚至可以用一个准备好的查询。

有人可以在这里借一些智慧吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

您应该使用lib运算符,后跟查询标记(无括号),并将查询标记的参数作为数组提供:

IN