Как я СУШИТЬ мои просмотры CouchDB?
Что я могу сделать для совместного использования кода между представлениями в CouchDB?
Пример 1 - служебные методы
Jesse Hallett содержит некоторые полезные утилиты, включая
function dot(attr) {
return function(obj) {
return obj[attr];
}
}
Array.prototype.map = function(func) {
var i, r = [],
for (i = 0; i < this.length; i += 1) {
r[i] = func(this[i]);
}
return r;
};
...
Где я могу поместить этот код, чтобы каждое представление могло получить к нему доступ?
Пример 2 - константы
Аналогично для констант, которые я использую в своем приложении. Где я помещаю
MyApp = {
A_CONSTANT = "...";
ANOTHER_CONSTANT = "...";
};
Пример 3 - фильтр фильтра:
Что делать, если я хочу, чтобы одно представление, которое фильтрует "это богатый человек?":
function(doc) {
if (doc.type == 'person' && doc.net_worth > 1000000) {
emit(doc.id, doc);
}
}
а другой - индексы по имени:
function(doc) {
if (doc.last_name) {
emit(doc.last_name, doc);
}
}
Как я могу объединить их в виде "богатых людей по фамилии"?
Я вроде хочу эквивалент Ruby
my_array.select { |x| x.person? }.select { |x| x.net_worth > 1,000,000 }.map { |x| [x.last_name, x] }
Как я могу быть DRYer?
Ответы
Ответ 1
Ответ лежит в couchapp. С помощью couchapp вы можете встроить макросы, которые включают общий библиотечный код в любой из разделов проектных документов. Это делается до того, как проектный документ будет отправлен на сервер. Что вам нужно сделать, чтобы выполнить запрос, о котором вы спрашиваете, это изменить клавиши, которые испускаются, чтобы вы могли выполнить запрос диапазона в "сети"
function(doc)
{
if (doc.type == 'person')
{
emit([doc.net_worth, doc.lastname], null);
}
}
Вы не хотите включать документ, который вы можете сделать с помощью include_docs=true
в параметрах запроса. И вы получаете doc.id бесплатно как часть ключа. Теперь вы можете сделать запрос диапазона на networth, который будет выглядеть примерно так.
http://localhost:5984/database/_design/people/_view/by_net_worth?startkey=[1000000]&endkey=[{},{}]&include_docs=true
Ответ 2
По это сообщение в блоге, вы можете добавить модули commonjs в функцию map (но не уменьшить функция) в представлениях в couchdb 1.1 с помощью ключа, называемого lib в вашем объекте views. Многие популярные библиотеки javascript, такие как underscore.js, соответствуют стандарту commonjs, поэтому вы можете использовать их в своих представлениях с помощью require ( "views/lib/[your module name]" ).
Предположим, вы включили underscore.js как "подчеркивание" в объекте lib в представлениях, например:
views: {
lib: {
underscore: "// Underscore.js 1.1.6\n ...
}
...
[ the rest of your views go here]
}
вы можете добавить следующее к своему виду, чтобы получить доступ к модулю _:
var _ = require("views/lib/underscore");
Для пользовательских библиотек все, что вам нужно сделать, это сделать все, что вы хотите предоставить в своей библиотеке, значение для глобального объекта экспорта.
Ответ 3
Из CouchDB Wiki:
Нет планов развития совместного использования кода/функций между представлениями. Каждая функция просмотра хранится в соответствии с хэш-представлением их байтов, поэтому важно, чтобы функция не загружала никакого дополнительного кода, изменяя его поведение без изменения его байтовой строки. Следовательно, прецедент для CouchApp.
Ответ 4
Couchapp будет "макро" в библиотеках, и он работает очень хорошо.
Другой, неподдерживаемый вариант - добавить такие служебные функции, как это, к настраиваемому серверу запросов. JS файл не так уж трудно понять, а версии Ruby и Python еще проще. Сервер представления компилирует строки в проекте doc в функциональные объекты по мере их выполнения, поэтому, если вы закрываете эти функции над функциями полезности, константами или чем-то другим, они будут исполняться в функциях map/reduce/show/list.
Найдите место в файле main.js, где определены "emit" и "log", и эмулируйте определение этих функций, чтобы вывести свои пользовательские функции утилиты на карту и уменьшить lambdas.
Предостережение. Изменение сервера просмотра, не требующее перестройки на вашем представлении, будет означать, что ваш индекс просмотра будет неправильным. Программист Остерегайтесь.
Ответ 5
Вы не можете сделать это (последний раз я проверил), потому что представления хранятся в базе данных, а ключ для представления - сам хэш. Вид не может полагаться на внешние данные/логику/программирование, потому что если он изменится, представление будет другим и не будет соответствовать. Это смутило меня и все еще делает, поэтому я могу ошибаться.