Я считаю, что лучшим способом было бы иметь слушателя _changes, который обновляет документы заказа со стоимостью цены каждого продукта в позициях, когда запись становится исторической (то есть, только для чтения).Просто кажется неправильным, что цена может измениться для прошлого заказа, и вы не можете распечатать правильный отчет / счет-фактуру, не пройдя вниз по диапазонам цен кроличьей норы ....
Чтобы решить проблемукак вы заявили, если у вас есть некоторый код на стороне клиента, который может работать с JSON, может помочь трюк, указанный в Связанные документы .Учитывая функцию карты, такую как:
function(doc) {
if(doc.type == 'order') {
for(var position in doc.positions) emit(doc._id,{_id: doc.positions[position]});
}
}
, вы можете использовать ? Include_docs = true & key = "2666df80782596200fca49557d758228" , чтобы вернуть ваш пример заказа с позициями, включая цену.
К сожалению,, вы не можете использовать include_docs с сокращением, так что это может быть хорошей отправной точкой для демона _changes, как я уже упоминал, для создания сводного документа заказа, который выглядит как то, что вы хотите для окончательного ответа ...
[редактировать, чтобы добавить решение] Ну, я нашел способ, но он не очень хорош.
Учитывая проектный документ с этой функцией просмотра карты:
function(doc) {
if(doc.type == 'order') {
for(var p in doc.positions) emit(doc.orderDate, {_id: doc.positions[p]});
}
}
иэта функция списка:
function(head, req) {
var count = 0;
var dates = {};
var totals = {};
while(r = getRow()) {
if(!(r.id in dates)) {
count += 1;
dates[r.id] = r.key;
totals[r.id] = 0;
}
totals[r.id] += r.doc.price;
}
start({'headers': {'Content-Type': 'application/json'}});
send('[\n');
for(var order in dates) {
count -= 1;
send(JSON.stringify({'_id': order, 'orderDate': dates[order], 'total': totals[order]}));
send((count > 0)?',\n':'\n');
}
send(']\n');
}
Ваш желаемый результат -
/db/_design/[Design Doc Name]/_list/[List Function Name]/[Map Function Name]?include_docs=true
Кстати, в этом случае ключевыми значениями являются orderDate ...