Apache Drill使用IN()运算符查询mongo数组字段类型

时间:2017-09-21 20:42:02

标签: sql mongodb apache apache-drill

采用以下文档结构作为示例,我需要在钻取中执行SELECT ... WHERE字段IN(值)。

{   "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 ]
    }
}

要按USUARIO.PUBLICOALVO值查找文档,我可以使用下面的mongo查询:

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

它工作正常,通过IN()比较列表返回所有文档。

但是,当我尝试在DRILL的SQL中执行相同的mongo查询时,我这样做:

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

但是此查询失败,并显示消息:

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

我如何在钻取sql语法中编写过滤器IN()之王?

非常感谢

1 个答案:

答案 0 :(得分:2)

Apache Drill的Mongo存储插件不支持IN运算符。

original documentation for Apache Drill's Mongo storage plugin声明:

  

截至目前,谓词下推是针对以下过滤器实施的:>,> =,<,< =,==,!=,isNull和isNotNull。

查看latest version of the code情况仍然如此:

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不是唯一不受支持的运营商;尽管针对Drill Mongo存储插件存在open issue,但LIKE运算符尚不受支持。

所以你可以......

  • 自己实施IN运算符。 this issue附有一个补丁,可能会为如何实施IN运营商提供指导
  • 针对指定Component=Storage - MongoDB
  • Drill project提出问题
  • 将您的IN实施为一系列ORed等于而不是WHERE xxx.USUARIO.PUBLICOALVO IN (84, 85, 90, 94, 500)您可以尝试WHERE xxx.USUARIO.PUBLICOALVO = 84 OR xxx.USUARIO.PUBLICOALVO=85 ...