我在看这张图表......
http://www.mongodb.org/display/DOCS/MongoDB,+CouchDB,+MySQL+Compare+Grid
...说:
查询方法
CouchDB - 映射/减少javascript函数以懒惰地为每个查询构建索引
MongoDB - 动态;基于对象的查询语言
这究竟是什么意思?例如,如果我想取平均1,000,000,000个值,那么CouchDB会以MapReduce方式自动执行吗?
有人可以告诉我如何在两个系统中平均获得1,000,000,000个值......这将是一个非常有启发性的例子。
感谢。
答案 0 :(得分:8)
我不能谈论MongoDB,但我可以告诉你有关CouchDB的信息。 CouchDB只能通过Map / Reduce View Engine进行本地查询。事实上,一个很好的起点是维基的section。
视图包含地图功能和可选 reduce 功能。编写这些函数的典型语言是JavaScript,但是有一个Erlang选项可用,并且可以用几乎任何其他编程语言构建视图引擎。
map函数用于从数据库中的文档构建数据集。 reduce函数用于聚合该数据集。因此,一旦创建视图,就会在数据库中的每个文档上运行map函数。 (并且首先查询)创建后,该功能仅在新创建或修改/删除的文档上运行。因此,视图索引是增量,而不是动态构建。
在1,000,000,000个值的情况下,CouchDB不需要在每次请求时计算查询结果。相反,它只报告它存储的视图索引的值,它本身仅在创建/更新/删除文档时才会更改。
就编写Map / Reduce函数而言,很多工作由程序员完成,因为没有内置的map函数。 (即,它不是“自动的”)但是,有一些native reduce functions(_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
}
}
]
}
从这里计算平均值就像将总和除以计数一样简单。如果您想要在视图中计算平均值,可以查看this example。
答案 1 :(得分:8)
CouchDB的观点是一种奇怪而迷人的野兽。
CouchDB执行增量map / reduce,也就是说,一旦指定了“view”,它就会像关系数据库中的物化视图一样工作。如果你平均有3到30亿个文件,那就无所谓了。结果就在那里。
但那里有三倍的问题
1)一旦创建并更新视图,查询就会很快。如果您有大量小文档(如果可能的话,请使用更丰富的文档),视图创建可能会很慢。创建视图后,中间减少步骤将存储在B树节点内,您将不必重新计算它们。
2)当您查询时,视图会被懒惰地更新。为了获得可预测的性能,您最好设置某种工作来定期更新它们。 How do you Schedule Index Updates in 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