我不能谈论 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
}
}
]
}
从这里计算平均值就像用总和除以计数一样简单。如果您想在视图本身内计算平均值,您可以查看此示例。