2016-03-22 17 views
1

Bu yeni bir potansiyel soruyu soruyor ama vahşi bir cevap bulamadım.nodejs 'cassandra-driver' IN sorgusuyla sorgu hazırlandı IN sorgu

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

Ben isteğe bağlı olarak bir tarafından filtre tüm olayları getirmesi hazırlanmış bir sorgu yapmak istiyorum: Şu anda bu formun basit bir kullanıcı olay günlüğünü (bu basit tutmak için elided bazı nitelikler) inşa ediyorum

Kullanıcıya birkaç saat boyunca ideal olarak bazı seviyeler üzerinde verilir.

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

Bu, tek bir saat ve seviye için çalışıyor:

Kolayca tek düzeyi ve saat sorgulayan bir sorgu oluşturabilirsiniz. Yukarıdaki sorguda birden fazla saat ve seviye belirtmek isterim ancak kodla oynamak, dizeyi bir dize olarak veya değer dizisi olarak belirterek çalışmayı başaramam.

ben böyle bir şey yapmak zorunda düşünüyorum:

ihtiyaç vardır düzeyleri ve saat sayısı dayalı sorgu oluşturun:

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

Bunu sevmiyorum. AMA 'Hazırlanmış gerçekleri geçebildiğimiz için hala hazırladığımız soruların faydalarını bile bulabilirim. Daha iyi bir yol olmalı gibi hissettiriyor ... ama yapmaya çalıştığım şey, tek bir hazır sorguda bile mümkün değil.

Burada herhangi bir bilgelik isteyen var mı?

Teşekkürler!

cevap

3

Sorgu işaretleyici (hayır parantez) izledi IN operatörünü kullanın ve bir dizi olarak sorgu işaretleyici için parametre sağlamalıdır:

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

Eh ben darned olacağım. Teşekkür ederim! Bu harika çalıştı ve her şey yine dünyada haklı. İzleyen herkes için bir not - Bu parametrelerden geçmek için harita notasyonunu kullanarak çalışmak için bunu alamadım. yani, @jorgebg, yukarıda belirtilen paragraflarda verilen paragraflar = {level: [10,20,30], saat: [2016032117], 'user_uuid'} 'işlevini yerine getiremezdi - dizilerdeki konumsal değerlerin kullanımı büyük olur. . – darrin

+0

Benim sorgum const query = 'SELECT * FROM events.by_hour WHERE (düzey, saat) IN(); Paramimlerim ne olmalı? Teşekkürler. – B1K