Apache Drill 与 mongodb。在地图中查询具有特定键和值的文档

Posted

技术标签:

【中文标题】Apache Drill 与 mongodb。在地图中查询具有特定键和值的文档【英文标题】:Apache Drill with mongodb. Query for documents with particular keys and values within a map 【发布时间】:2017-11-23 13:32:00 【问题描述】:

我在 mongodb 中使用 apache Drill。我在 mongodb 中的文档是这样的:


  "labels": [
              "key": "product",
              "value": "shampoo"
              ,
              
               "key": "id",
               "value": "1"
               ,
              
               "key": "number",
               "value": "0"
               ]
 ,
 "labels": [
              "key": "product",
              "value": "shampoo"
              ,
              
               "key": "id",
               "value": "2"
               ,
              
               "key": "number",
               "value": "1"
               ]
 

我想查询具有 e 的文档。 G。标签 "key": "id", "value": "1"

我用这个查询试了一下:

select * from myCollection where `labels.key` = 'id' and `labels.value` = '1';

它应该只返回第一个文档,但它同时返回两个文档,因为第二个文档有一个 key = number 和 value = 1 的标签(之所以如此,是因为 value)。

是否有可能只获得第一个文件?查询应该是什么样子?

Drill 将集合转换为这样的表:

+---------------------------------------------------------------+
                                labels
+---------------------------------------------------------------+
["key": "product", "value": "shampoo", "key": "id", "value": "1",...]
["key": "product", "value": "shampoo", "key": "id", "value": "2", ...]
+----------------------------------------------------------------+

【问题讨论】:

这可能是一个逻辑问题。本质上,您是在要求 Drill 给您任何同时包含 'key' 中的 'id' 和 'value' 中的 '1' 的结果。除了数字应该存储为数字这一事实之外,您将获得两行,因为 key: id 和 value: 1 对于第一个标签中的第二个条目是正确的;还有关键:第二个标签中的第二个条目的 id 是正确的,第二个标签中的第三个条目的值为 1,第二个条目的值为 2……很多真实的状态。你想组合它们,Drill 会分别看到它们。 【参考方案1】:

这在 Apache Drill 中是不可能的。

在 MongoDB 中,您可以使用 $elemMatch 运算符来表达此标准,例如:

db.collection.find(
    labels:  $elemMatch:  key: "id", value: "1"   
)

但是,Apache Drill 的 Mongo 存储插件不支持 $elemMatch 运算符。

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

到目前为止,为以下过滤器实现了谓词下推:>、>=、

看看latest version of the code,情况仍然如此......不支持$elemMatch,也没有关系运算符可以为您执行此匹配。

【讨论】:

以上是关于Apache Drill 与 mongodb。在地图中查询具有特定键和值的文档的主要内容,如果未能解决你的问题,请参考以下文章

在 apache-drill 中使用 bootstrap-storage-plugins.json 文件作为存储插件的异常

Apache Drill 与 Kerberos

* 使用 apache Drill 将 saiku 与 mongo 连接时代替键

使用 Apache Drill

drill 数据源配置

drill 数据源配置补充