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 文件作为存储插件的异常