14

我一直在研究 noSQL DB,但无法为自己满意地回答这个问题:是否可以针对 noSQL DB 构建复杂的查询?

我想知道的查询类型是这样的:

select * from DB where
vara > x AND
varb = 2 AND
varc < x AND
vard in (x,y,z) AND
vare like '%texthere%' AND
varf = 2 AND
varg = 3 and
etc...

注意:我知道我不能使用 SQL,如上所述,我要问的是如何使用上面的伪逻辑进行查询,换句话说,就是一堆不同的条件。到目前为止,我发现的最佳答案是您有一个 RDBMS 来查询,然后根据来自云的密钥获取数据。这对我来说并不一定更有效。

所以作为后续。如果只是试图解决“搜索 400 万行”问题而不是“我们有数十亿行数据”问题,我是否应该费心查看 noSQL 数据库?

4

4 回答 4

10

mongodb中,您只需执行类似的操作db.mytbl.find({"vara": { $gt: 10}, "varb": 2, "varc": {$lt: 100 }})

这里这里有例子

于 2010-02-28T15:57:48.953 回答
5

这取决于您使用的数据存储。

我经常使用 AppEngine 并且他们的数据存储只允许在一个列上存在不等式(并且该列必须是排序顺序中的第一个元素。因此您将无法运行您发布的查询,但您可以执行类似的查询:

select * from DB where
vara > x AND
varb = 2 AND
varc in (t,u,v,w)
vard in (x,y,z) AND
varf = 2 AND
varg = 3

此外,您可以执行一些操作,例如拥有一个包含字符串列表的列,并选择列表中具有值的行。

所以,官方的回答是“也许,有时,但不是真的,除非是”

于 2010-03-02T18:16:21.090 回答
1

我不是 NoSQL 专家,但顾名思义,他们不需要依赖 SQL。您可能可以做任何您想做的事情,但需要编写 map/reduce 函数或其他非 SQL 方式来查询数据。

也许这个博客给你提供了有用的信息:NoSQL 数据库的查询处理

于 2010-02-28T12:40:12.930 回答
0

在我看来,您可以在 MongoDB 等文档数据存储中做到这一点,但在 Cassandra 等键值数据存储中并不容易。如果您要在键值数据存储中执行此操作,则复合键必须识别所有查询的数据元素(列)。换句话说,一个实例必须具有所有查询列。这个有可能。在 vanilla 键值存储中,每个键都有一个数据元素(列),但您可以这样做以支持多个。键值存储允许这样做,因为该值只是一个字符串值并且可以包含您想要的内容。我建议每个键使用多个数据元素(列),但您必须为此进行编程。相反,如果您将列放在不同的列实例中,则垂直搜索数据会非常慢,即使这些列是有序的。您问题中的示例只有一张表。如果您有多个关系表,在键值存储中,您必须创建一个新的列族来存储连接的数据,并且每个键仍然必须有多个数据元素。但是,它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?如果您有多个关系表,在键值存储中,您必须创建一个新的列族来存储连接的数据,并且每个键仍然必须有多个数据元素。但是,它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?如果您有多个关系表,在键值存储中,您必须创建一个新的列族来存储连接的数据,并且每个键仍然必须有多个数据元素。但是,它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?在键值存储中,您必须创建一个新的列族来存储连接的数据,并且每个键仍然必须有多个数据元素。但是,它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?在键值存储中,您必须创建一个新的列族来存储连接的数据,并且每个键仍然必须有多个数据元素。但是,它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?它必须通过类似 ETL 的过程在一个系列中的一个实例中水平预加载。换句话说,在数据加载到键值存储之前加入数据,并设计 Cassandra 数据存储将已经组合的数据存储在具有多个值的列中。或者使用数据挖掘。我相信“大数据分析”目前正在解决键值存储中的这个问题。另一个没有您复杂的示例是,您如何在键值商店中按产品按客户按周生成销售收入和数量的简单报告?

于 2012-08-27T02:37:06.577 回答