2016-03-22 21 views
1

これは潜在的な初心者質問ですが、私は野生の答えを見つけることができませんでした。INのクエリでnodejs 'cassandra-driver'の準備クエリを使用

私は現在、(いくつかの属性は、この単純なを維持するために省略さ)このフォームの簡単なユーザイベントログを構築しています:

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

は、私はこれを愛していません。しかし、準備されたクエリのメリットはここでも得られます。なぜなら、「準備済み:真」を渡すことができるからです。それは良い方法があるはずだと感じる...しかし、私は何をしようとしているか分からないが、単一の準備クエリでも可能です。

誰でも知恵を貸すことはできますか?

ありがとうございます!

答えて

3

あなたは、クエリのマーカー(なしかっこ)に続いて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); 
+0

まあ、私はとびきりされます。ありがとうございました!それはすごくうまくいって、すべてが再び世界で正しいです。次の誰かのためのメモ - 私はパラメータを渡すためにマップ表記を使用してこれを動作させることができませんでした。つまり、上記の@jorgebgの例では、paramsを 'const params = {level:[10,20,30]、hours:[2016032117]、 'user_uuid'}'として再定義すると動作しません。 。 – darrin

+0

私のクエリが の場合、const query = 'SELECT * FROM events.by_hour WHERE(level、hour)IN(); 私のパラメータは何ですか?ありがとう。 – B1K

関連する問題