Я не могу говорить о MongoDB, но могу рассказать вам о CouchDB. CouchDB может быть запрошен только через Map / Reduce View Engine. На самом деле, отличное место для начала - это раздел вики.
Представление содержит функцию map и опциональную функцию уменьшения . Типичным языком для написания этих функций является JavaScript, но есть опция Erlang, и можно создать движок представления практически на любом другом языке программирования.
Функция карты служит для построения набора данных из документов в базе данных. Функция сокращения служит для агрегирования этого набора данных. Таким образом, функция карты запускается для каждого отдельного документа в базе данных после создания представления. (и первый запрос) После создания эта функция запускается только для документа, который был только что создан, или изменен / удален. Таким образом, индексы представления строятся постепенно , а не динамически.
В случае 1 000 000 000 значений CouchDB не нужно будет вычислять результаты вашего запроса каждый раз, когда он запрашивается. Вместо этого он будет сообщать только о значении сохраненного индекса представления, который сам меняется только при создании / обновлении / удалении документа.
Что касается написания функций 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
}
}
]
}
Вычислить среднее отсюда так же просто, как разделить сумму на количество. Если вы хотите, чтобы среднее значение вычислялось в самом представлении, вы можете проверить в этом примере .