Подтвердить что ты не робот

Как я СУШИТЬ мои просмотры 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?

4b9b3361

Ответ 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

Вы не можете сделать это (последний раз я проверил), потому что представления хранятся в базе данных, а ключ для представления - сам хэш. Вид не может полагаться на внешние данные/логику/программирование, потому что если он изменится, представление будет другим и не будет соответствовать. Это смутило меня и все еще делает, поэтому я могу ошибаться.