代码之家  ›  专栏  ›  技术社区  ›  Tom DeMille

是否可以对nosql db构造复杂的查询

  •  13
  • Tom DeMille  · 技术社区  · 16 年前

    我一直在研究nosql db,但一直未能满意地回答这个问题:是否可以对nosqldb构造复杂的查询?

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

    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,如上所述,我要问的是如何使用上面的psuedo逻辑进行查询,换句话说,是一大堆不同的条件。到目前为止,我找到的最佳答案是,您有一个rdbms来查询,然后根据来自云的密钥获取数据。在我看来,这并不一定更有效率。

    作为后续行动。如果只是想解决一个“搜索400万行”的问题,而不是“我们有数十亿行的数据”的问题,我甚至应该麻烦看一个nosql db?

    4 回复  |  直到 13 年前
        1
  •  9
  •   nos    16 年前

    mongodb ,你只需要做一些 db.mytbl.find({"vara": { $gt: 10}, "varb": 2, "varc": {$lt: 100 }})

    here here 举例来说

        2
  •  5
  •   Jackson Miller    16 年前

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

    我经常使用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
    

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

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

        3
  •  1
  •   ewernli    16 年前

    我不是nosql专家,但正如名字所说,他们不需要依赖sql。您可能可以做任何您想要做的事情,但是需要编写map/reduce函数或其他非sql方式来查询数据。

    也许这个博客能为你提供有用的信息: Query processing for NoSQL database

        4
  •  0
  •   TomFH    13 年前

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

    推荐文章