На Безграничный мы углубились в вариант # 2 и представили его тысячам студентов. Наш сервер представляет собой JSON REST API (Scala + MongoDB), и весь наш клиентский код обслуживается прямо из CloudFront (то есть: www.boundless.com - это просто псевдоним CloudFront).
Плюсы:
Минусы:
Я действительно думаю, что это будущее всех веб-приложений.
Некоторые мысли для пользователей веб-интерфейса (вот где вся новизна / вызов дается этой архитектуре):
Мы создали жгут для нашей интерфейсной разработки под названием «Spar» (одностраничное приложение Rocketship), которое фактически представляет собой конвейер ресурсов от Rails, настроенный для разработки одностраничных приложений. В течение следующих нескольких недель мы будем открывать ресурсы на нашей странице github вместе с сообщением в блоге, объясняющим, как использовать его и общую архитектуру более подробно.
ОБНОВЛЕНИЕ:
Что касается проблем людей с Backbone, я думаю, что они переоценены. Магистраль - это скорее организационный принцип, чем глубокая структура. Сам сайт Твиттера - гигантский зверь из Javascript, охватывающий каждый кейс для миллионов пользователей. устаревшие браузеры, загружая твиты в реальном времени, собирая мусор, отображая большое количество мультимедиа и т. д. Из всех «чистых» js-сайтов, которые я видел, Twitter - самый странный. Было много впечатляюще сложных приложений, доставленных через JS, которые очень хорошо работают.
И ваш выбор архитектуры полностью зависит от ваших целей. Если вы ищете самый быстрый способ поддержки нескольких клиентов и имеете доступ к хорошим фронтенд-талантам, инвестирование в автономный API - отличный способ.
Ваше выражение emit мне кажется немного странным. Цель emit - создать ключ (т.е. индекс), а затем значения документа, которые вас интересуют.
например:
emit( doc.index, [doc.name, doc.address, ....] );
Вы генерируете массив для индекса, а не данных для представления.
Кроме того, Couchdb не предусматривает пересечения представлений, так как он не очень хорошо соответствует парадигме map / reduce. Итак, ваши потребности сводятся к тому, чтобы попытаться решить следующее:
Могу ли я создать уникальный индекс, из которого затем можно извлечь определенный диапазон? (используя startkey и endkey)
A CouchDB view is an ordered list of entries. Queries on a view return a contiguous slice of that list. As such, it's not possible to apply two inequality conditions.
Assuming that your loan_period is a discrete variable, this case would probably be best solved by emit'ing the loan_period first and then issuing one query for each period.
An alternative solution would be to use couchdb-lucene.
На самом деле CouchDB позволяет представлениям иметь сложные ключи, которые представляют собой массивы значений, как указано в вопросе:
[template_id, loan_name, loan_period, loan_amount]
Вы пробовали
params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
:endkey=>["7446567e45dc5155353736cb3d6041c0",{}],:include_docs => true}
или, возможно,
params = {:startkey =>["7446567e45dc5155353736cb3d6041c0","\u0000",5,30000],
:endkey=>["7446567e45dc5155353736cb3d6041c0","\u9999",{}],:include_docs => true}
You're using arrays as your keys. Couchdb will compare arrays by comparing each array element in increasing order until two element are not equal.
E.g. to compare [1,'a',5]
and [1,'c',0]
it will compare 1 whith 1, then 'a' with 'c' and will decide that [1,'a',5] is less than [1,'a',0]
This explains why your range key query fails:
["7446567e45dc5155353736cb3d6041c0",nil,5,30000]
is greater ["7446567e45dc5155353736cb3d6041c0",nil,5,90000]