NoSQL DB上的查询问题中的聚合函数,缺少类型,熵

时间:2013-12-09 10:17:24

标签: sql mongodb couchdb database nosql

虽然我们认为NoSQL数据库已经填补了一些在RDBMS方面具有挑战性的差距,但随着时间的推移,我在其查询生态系统领域遇到了一些NoSQL DB的挑战。

例如Couchbase,就像其母CouchDB在使用视图,列表,键查找,map reduce,e.t.c读取数据方面有了重大改进。对于他们庞大的2.X版本,Couchbase甚至moved to createSQL-like query engine。 MongoDB也做了很多改进,并且可以在其上进行复杂的查询以及许多其他的NoSQL DB开发。

大多数NoSQL DBs can perform Complex queries基于LOGICAL and COMPARISON OPERATORS,例如ANDOR== e.t.c然而,对我来说,混淆和执行复杂的数据关系是一个问题。例如,在CouchDB和/或Couchbase中,视图仅跨越一个DB。不可能编写一个汇总来自两个或多个数据库的数据的视图。

现在让我解决这个问题。函数(无论是否聚合):AVGSUMROUNDTRUNCMAXMIN等缺少数据类型使得无法有效地使用日期和时间因此缺乏日期和时间功能,例如TO_DATESYSDATE(系统日期/时间),ADD_MONTHSsDATE BETWEENDATE/TIME format Conversion e.t.c.确实,许多人会说,他们缺乏架构,类型和东西,但是,我发现自己并没有逃避至少需要在其中列出的任何一个功能。例如,由于NoSQL DB没有日期/时间数据类型,因此很难根据这些数据执行查询,因为您可能希望根据时间分析趋势。此外,其他人试图使用UNIX / EPOC时间戳和东西来解决这个问题,但它不是single size fits all解决方案。

Map Reduce可用于实现某些(小)的聚合学位,但开销已经实现了很大。但是,缺乏GROUP BY功能使得它成为过滤掉你想要的东西的过分解决方案。请看下面的查询:

SELECT 
doc.field1, doc.field3, SUM(doc.field2 + doc.field4)
FROM 
couchdb.my_database 
GROUP BY doc.field1, doc.field3 
HAVING SUM(doc.field2 + doc.field4) > 20000;

这在CouchDB或Couchbase上并不容易实现。我不确定它是否可能在MongoDB上。我希望它可以开箱即用。这使得NoSQL很难用作数据仓库或OLTP / OLAP解决方案。我发现,每次需要进行复杂的分析时,都需要通过分页不同的数据集在中间件中进行。现在,大多数有经验的人(例如CLOUDANT)已经调整LUCENE来执行复杂的查询,但由于它最初用于索引和文本搜索,因此它没有解决FUNCTIONS和大多数NoSQL DB上的DATA AGGREGATION

由于缺少FUNCTIONS,大多数NoSQL DB都具有NULL数据类型,但缺少将NULL对象转换为其他对象的选项,就像在某些RDBMS中一样。例如在Oracle中,我可以:NVL(COLUMN,0)以便在对给定列执行AVG计算时包含所有行(因为默认情况下,空列不会计入/包含在查询处理)。

为了完全理解这个问题,例如CouchDB视图在如下文档的范围内运行:

function(doc){
    // if statements, logical operators, comparison operators
    // e.t.c here. until you do am emit of that doc
    // if it satisfies the conditions set
    // emit(null, doc) OR emit(doc.x,[doc.y, doc.z]) e.t.c.
    // you can only emit javascript data types anyways
    emit(doc.field1,doc)
}
满足过滤器的文档将通过并进入下一阶段或减少功能。想象一下这样的doc结构:

{
    x: '',
    y: '',
    z: {
        p: '',
        n: N    // integer or number data type        
    },
    date: 'DD/MON/YYYY'  // date format
}

现在,让我们想象一下这种查询的可能性:

function(){
    var average = select AVG(doc.z.n) from couchdb.my_database;
    var Result = select doc.x,doc.y from couchdb.my_database where 
            doc.z.n > average and doc.y = 'some string' and 
            doc.date between '01-JUN-2012' and '03-AUG-2012';
    emit(Result);
}

或者如果可以进行此查询:

function(){
    var latest = select MAX(doc.date) from couchdb.my_database;
    var Result  = select 
                    doc.x,doc.z.p,MONTHS_BETWEEN(doc.date,latest) as "Months_interval" 
                    from couchdb.my_database where doc.y like '%john%' 
                    order by doc.z.p;
    emit(Result);
}
Qn 1: NoSQL数据库解决方案在很大程度上取得了哪些成果,在上面的细节中讨论了查询功能?哪些关键功能让它脱颖而出?

问题2:在查询这些数据库时缺少架构或Key-Value是否缺少FUNCTIONS的特征?在大多数NoSQL DB中缺少聚合功能的原因是什么?

Qn 3:如果在任何NoSQL DB中都可以使用上述查询功能,请展示如何使用现有的NoSQL基础架构获得上述最后两(2)个查询问题(考虑您的任何NoSQL技术)选择)

1 个答案:

答案 0 :(得分:1)

MongoDB有一个名为Aggregation Framework的东西,它运行得很好。我想说几乎每个SQL聚合查询都可以使用这个框架来执行。 Here您有一些从SQL到聚合框架的“转换”示例。

无论如何,MongoDB是一个面向文档的数据库而不是像CouchDB这样的键值,所以我不知道它是否符合你的要求。