在PouchDB视图

时间:2016-10-14 16:13:57

标签: javascript couchdb pouchdb

我正在构建一个用户可以输入单词的应用程序。让我们说这样的话是汽车品牌。基于这个汽车品牌,我希望得到每个工厂的工人数量。我的PouchDB数据库中的结构是每个文档代表一个工厂,文档包括工人数量和品牌名称。 ID是日期时间,因此它们对查询没有帮助。

这是我现在创建的代码:

function getWorkers() {
                  //Get and remove current design doc
                  factoryDB.get('_design/workers').then(function (doc) {
                      return factoryDB.remove(doc)

                  //Create new design doc and put it to the db
                  }).then(function () {
                    var designWorkers = {
                          _id: '_design/workers',
                          views: {
                            'workersView': {
                              map: function(doc) {
                                  if (doc.Brand === $('#input').val()) {
                                      emit(doc.workers,doc);}
                              }.toString()
                            }
                          }
                        };
                      return factoryDB.put(designWorkers);

                    //Now start the query
                    }).then(function () {
                    return factoryDB.query('workersView')

                   //And get the results
                  }).then(function(result) {
                         console.log(result)
                  }).catch(function (err) {
                      console.log(err)
                  });
              };

只要用户单击按钮,就会调用该函数。 它第一次工作正常。但是一旦我改变了这个词,它仍然会返回上一个查询的结果。例如:

首先,用户输入“Mercedes”,返回所有带有“Mercedes”的工厂文件。但是,如果我现在删除它而不是写“奥迪”,我仍然会得到“梅赛德斯”的文件。我真的不明白,因为我认为每当再次调用函数时我都会删除以前的设计文档,因此输入值也会改变。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。 而不是:

if (doc.Brand === $('#input').val()) {
    emit(doc.workers,doc);}.toString()

我将条件传递给查询:

function(doc) {
   if (doc.Brand) {
      emit(doc.Brand,doc.workers);}
   }.toString()
.
.
.
return factoryDB.query('workersView', key: {$('#input').val()})

然而,剩下的问题是,它查询所有文档,而前一个文档已经在map函数中被过滤(total_rows属性更大)。也许有人仍然可以给我一个比我更好的解决方案。