2017-09-21 1 views
2

Nehmen Sie die folgende Dokumentstruktur für Beispiel, wo ich ein SELECT ... WHERE Feld IN (Werte) in Drill.Apache Drill Abfrage Mongo-Array Feldtyp mit IN() -Operator

{ "CD_MATRICULA" : 12, 
    "USUARIO" : { 
     "ID_SITUACAO" : 1, 
     "PUBLICOALVO" : [ 84,85,86,87,88,89 ] 
    } 
}, 
{ "CD_MATRICULA" : 14, 
    "USUARIO" : { 
     "ID_SITUACAO" : 1, 
     "PUBLICOALVO" : [ 90,91,92,93,94 ] 
    } 
}, 
{ "CD_MATRICULA" : 122, 
    "USUARIO" : { 
     "ID_SITUACAO" : 0, 
     "PUBLICOALVO" : [ 20,300,400,500,600 ] 
    } 
} 

Um Dokumente von USUARIO.PUBLICOALVO Wert zu finden, kann ich die Mongo Abfrage, die folgt:

db.getCollection('xxx').find({'USUARIO.PUBLICOALVO': {$in: [ 84, 85, 90, 94, 500 ]}}) 

es funktioniert gut, alle Dokumente von IN() comparsion von Listen zurück.

Aber, wenn ich versuche, die gleiche Mongo Abfrage in SQL von DRILL auszuführen, muss ich dies:

SELECT * FROM xxx WHERE xxx.USUARIO.PUBLICOALVO IN(84, 85, 90, 94, 500); 

Aber diese Abfrage fehlschlägt, mit der Meldung:

Error in expression at index -1. Error: Missing function implementation: [equal(INT-REPEATED, INT-REQUIRED)]. Full expression: --UNKNOWN EXPRESSION--. 

Wie kann ich schreibe diesen König von Filter IN() in der Drill-SQL-Syntax?

Dank viel

Antwort

2

Plugin Mongo Speicher des Apache Drill ist die IN-Operator nicht unterstützt.

The original documentation for Apache Drill's Mongo storage plugin erklärte:

Ab sofort Prädikat Pushdown- für folgende Filter implementiert:>,> =, <, < =, ==, = isNull und isNotNull!.

am latest version of the code Blick bleibt dies der Fall:

switch (functionName) { 
    case "equal": 
     compareOp = MongoCompareOp.EQUAL; 
     break; 
    case "not_equal": 
     compareOp = MongoCompareOp.NOT_EQUAL; 
     break; 
    case "greater_than_or_equal_to": 
     compareOp = MongoCompareOp.GREATER_OR_EQUAL; 
     break; 
    case "greater_than": 
     compareOp = MongoCompareOp.GREATER; 
     break; 
    case "less_than_or_equal_to": 
     compareOp = MongoCompareOp.LESS_OR_EQUAL; 
     break; 
    case "less_than": 
     compareOp = MongoCompareOp.LESS; 
     break; 
    case "isnull": 
    case "isNull": 
    case "is null": 
     compareOp = MongoCompareOp.IFNULL; 
     break; 
    case "isnotnull": 
    case "isNotNull": 
    case "is not null": 
     compareOp = MongoCompareOp.IFNOTNULL; 
     break; 
} 

FWIW, IN ist nicht der einzige nicht unterstützt Betreiber; Der LIKE Operator wird noch nicht unterstützt, obwohl es ein open issue gegen das Drill Mongo Storage-Plugin dafür gibt.

So Coult Sie ...

  • Zeitiger Abschluss der IN Betreiber selbst. Es gibt einen Patch this issue angebracht, die zum Teil mit Anleitung, wie zur Verfügung stellen könnte die IN Operator
  • Heben Sie ein Problem gegen die Drill project Angabe Component=Storage - MongoDB
  • Implementieren Sie Ihre IN als eine Reihe von ODER-Verknüpfung implementieren entspricht z.B. anstelle von WHERE xxx.USUARIO.PUBLICOALVO IN (84, 85, 90, 94, 500) können Sie versuchen WHERE xxx.USUARIO.PUBLICOALVO = 84 OR xxx.USUARIO.PUBLICOALVO=85 ...