是否可以针对noSQL DB构建复杂查询

时间:2010-02-28 12:31:46

标签: nosql

我一直在研究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 个答案:

答案 0 :(得分:9)

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

之类的操作

请参阅herehere示例

答案 1 :(得分: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

此外,您可以执行诸如包含字符串列表的列以及选择列表中具有值的行。

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

答案 2 :(得分:1)

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

也许此博客会为您提供有用的信息:Query processing for NoSQL database

答案 3 :(得分:0)

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