6

我在看这个图表...

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

...它说:

查询方法

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

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

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

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

谢谢。

4

2 回答 2

9

我不能谈论 MongoDB,但我可以告诉你关于 CouchDB。CouchDB 只能通过 Map/Reduce 视图引擎进行本地查询。事实上,一个很好的起点是 wiki 的这一部分

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

map 函数用于从数据库中的文档构建数据集。reduce 函数用于聚合该数据集。因此,一旦创建视图,map 函数就会在数据库中的每个文档上运行。(并首先查询)创建后,该函数仅在新创建的文档或已修改/删除的文档上运行。因此,视图索引是增量构建的,而不是动态构建的。

在 1,000,000,000 个值的情况下,CouchDB 不需要在每次请求时计算查询的结果。相反,它只会报告它存储的视图索引的值,它本身只会在创建/更新/删除文档时发生变化。

至于编写 Map/Reduce 函数,很多工作都留给了程序员,因为没有内置的 map 函数。(即它不是“自动的”)但是,有一些本机 reduce 函数_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

此视图的结果如下所示:

{
  "rows": [
    {
      "key": null
      "value": {
        "sum": 197,
        "count": 3,
        "min": 58,
        "max": 75,
        "sumsqr": 13085
      }
    }
  ]
}

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

于 2011-07-13T13:42:47.060 回答
9

CouchDB 的视图是一头奇怪而迷人的野兽。

CouchDB 执行增量映射/缩减,也就是说,一旦您指定了“视图”,它就会像关系数据库中的物化视图一样工作。如果您平均处理 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 亿个文档,但由于其内存映射 I/O 方法,mongo 被认为非常快)或它们的聚合功能。http://www.mongodb.org/display/DOCS/Aggregation

于 2011-07-13T13:46:10.197 回答