如何获取MongoDB与CouchDB中大数据的平均值?

Geo*_*off 6 couchdb mapreduce bigdata mongodb nosql

我在看这张图...

http://www.mongodb.org/display/DOCS/MongoDB,+CouchDB,+MySQL+Compare+Grid

...说:

查询方法

CouchDB - 映射/减少javascript函数以懒惰地为每个查询构建索引

MongoDB - 动态; 基于对象的查询语言

这到底是什么意思?例如,如果我想取平均1,000,000,000个值,那么CouchDB会以MapReduce方式自动执行吗?

有人可以告诉我如何使用两个系统平均获得1,000,000,000个值......这将是一个非常有启发性的例子.

谢谢.

Dom*_*nes 8

我不能谈论MongoDB,但我可以告诉你有关CouchDB的信息.CouchDB只能通过Map/Reduce View Engine进行本地查询.事实上,一个很好的起点是维基的这一部分.

视图包含一个map函数和一个可选的 reduce函数.编写这些函数的典型语言是JavaScript,但是有一个Erlang选项可用,并且可以用几乎任何其他编程语言构建视图引擎.

map函数用于从数据库中的文档构建数据集.reduce函数用于聚合该数据集.因此,一旦创建视图,就会在数据库中的每个文档上运行map函数.(以及第一查询)创建之后,该函数只能运行在其或者新创建的,或者被修改/删除的文件.因此,视图索引是以增量方式构建的,而不是动态构建的.

在10亿个价值的情况下,CouchDB的将不再需要计算你的查询结果它要求每一次.相反,它只报告它已存储的视图索引的值,它本身仅在创建/更新/删除文档时更改.

至于编写Map/Reduce函数,由于没有内置的map函数,很多工作都由程序员完成.(即它不是"自动")不过,也有一些本土减少功能(_sum,_count,_stats)可用.

这是一个简单的例子,我们将计算一些人的平均身高.

// sample documents
{ "_id": "Dominic Barnes", "height": 64 }
{ "_id": "Some Tall Guy", "height": 75 }
{ "_id": "Some Short(er) Guy", "height": 58 }

// map function
function (doc) {
  // first param is "key", which we do not need since `_id` is stored anyways
  emit(null, doc.height);
}

// reduce function
_stats
Run Code Online (Sandbox Code Playgroud)

此视图的结果如下所示:

{
  "rows": [
    {
      "key": null
      "value": {
        "sum": 197,
        "count": 3,
        "min": 58,
        "max": 75,
        "sumsqr": 13085
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

从这里计算平均值就像将总和除以计数一样简单.如果您想在视图中计算平均值,可以查看此示例.


小智 8

CouchDB的观点是一个奇怪而迷人的野兽.

CouchDB执行增量map/reduce,也就是说,一旦指定了"view",它就会像关系数据库中的物化视图一样工作.如果你平均有3到30亿个文件,那就无所谓了.结果就在那里.

但那里有三重陷阱

1)一旦创建并更新视图,查询就会很快.如果您有大量小文档(如果可能的话,请使用更丰富的文档),视图创建可能会很慢.创建视图后,中间减少步骤将存储在B树节点内,您不必重新计算它们.

2)当您查询时,视图会被懒惰地更新.为了获得可预测的性能,您最好设置某种工作来定期更新它们. 如何在CouchDB中安排索引更新

3)您需要非常了解如何使用复合键,范围和分组查询数据.CouchDB很难进行临时查询. http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

我确定有人会很快发布如何在两个数据库中平均1,000,000,000个项目的细节,但你必须明白CouchDB会让你做更多的前期工作,以便从增量方法中受益.它确实是一个非常独特的东西,但是当你在平均查询数据上做平均值或​​任何事情时,它并不真正用于场景.

在Mongo中,您可以使用map/reduce(不是增量.无论您是平均3或30亿个文档,但mongo由于其内存映射I/O方法被认为是非常快)或它们的聚合功能都很重要.http://www.mongodb.org/display/DOCS/Aggregation