Pouchdb在地图功能中组合来自多个数据库的数据

时间:2014-09-10 10:43:31

标签: pouchdb

我有一个带有docs的数据库和另一个带有类别的数据库现在我想在地图缩小视图中组合booth:

var categoryMapper = [...]
var viewName = 'byMonthAndCat10';
var index = {
    _id: '_design/'+viewName,
    views: {
        byMonthAndCat10: {
            map: function (doc) {
                if (doc.bookingDate) {
                    var date = moment(doc.bookingDate, moment.ISO8601_FORMAT);
                    categoryMappers.forEach(function(mapper) {
                        if(doc[mapper.field].indexOf(mapper.value)) {
                            emit([date.year(), date.month(), date.day()], [mapper.category, doc.debit+doc.credit]);
                        }
                    });
                }
            }.toString()
        }
    }
};

但是map函数是字符串化的,因此不再了解categorymapper。我该如何处理?我可以将categorymapper数组添加为字符串,但这不是很好,或者?

2 个答案:

答案 0 :(得分:2)

解决此问题的标准方法是将categoryId作为文档中的字段包含在内,然后使用linked documents将它们连接在一起。 (搜索该页面上的“链接文档”。)

如果你的数据非常关系,你可能还想查看relational pouch插件,它可以为你做很多这样的样板文件,所以你可以编写更少的代码。

答案 1 :(得分:0)

我这样做就知道了(基本上没有小袋的地图功能):

Transactions.allDocs({include_docs: true, endkey: '_'}).then(function (response) {
    var result = [];
    response.rows.forEach(function (row) {
        var doc = row.doc;
        var date = moment(doc.bookingDate, moment.ISO8601_FORMAT);
        var yearMonth = date.year()*100+date.month();
        categoryMappers.forEach(function(mapper) {
            switch(mapper.type) {
                case "contains":
                    if(doc[mapper.field].indexOf(mapper.value)) {
                        if(result.hasOwnProperty(yearMonth)) {
                            if(result[yearMonth].hasOwnProperty(mapper.category)) {
                                result[yearMonth][mapper.category] += doc.debit + doc.credit;
                            }
                            else {
                                result[yearMonth][mapper.category] = doc.debit + doc.credit;
                            }
                        }
                        else {
                            result[yearMonth] = {month: date.year()+'-'+date.month()};
                            result[yearMonth][mapper.category] = doc.debit + doc.credit;
                        }
                    }
                    break;
                default: throw new Error("CategoryMapper type not implemented yet!");
            }
        });
    });
    return result;
}).catch(function(err){ console.error(err); Transactions.info(console.debug); });