我在视图上使用 list 函数 完成了这项工作。以下是概述:
- 视图处理选择日期范围(按日期键并使用
.../myview?startkey=20150101&endkey=20150130
- 列表中有一些按类型分组的 Javascript。 (作为奖励,您还可以排序)。
我的 List 函数如下所示(基于 this Q&A 关于按类型对 javascript 数组进行分组):
function (head, req){
var row;
var rows = [];
while(row = getRow()){
rows.push({
"type": row.value.type,
"value1": row.value.value1,
"value2": row.value.value2
});
};
var result = rows.reduce(function(res, obj) {
if (!(obj.type in res)){
res.__array.push(res[obj.type] = obj);
} else {
res[obj.symbol].value1 += obj.value1;
res[obj.symbol].value2 += obj.value2;
}
return res;
},
{__array:[]}).__array;
send(toJSON(result));
}
前面的View应该emit日期作为key,javascript对象作为value。在此示例中,视图的一行应如下所示:"key":20150101, "value":{"type":"apple", "value1":28, "value2":0}。如果您是 Couch 的新手,以下是您编写 map 函数的方法(不要使用 reduce,但您可能会想 _sum):
function(doc){
if (doc.type === "mydoctype"){
// build array for the day
var items = [];
doc.items.forEach(function(item){
items.push({
'type': item.type,
'value1': +item.value1,
'value2': +item.value2
});
});
items.forEach(function(item){
// convert text date "yyyy-mm-dd"
var x = doc.date.split('-');
// to numerical date YYYYMMDD
newformatdate = +(x[0]+x[1]+x[2]);
emit(newformatdate, item);
});
}
}
最后,您的查询将如下所示:
http://localhost:5984/dbname/_design/ddocname/_list/mylistname/myviewname?startkey=20150501&endkey=20150510
我对 Javascript 和 Couch 都有些陌生,所以请随意尝试一下这段代码。