2016-10-14 14 views
0

ユーザーが単語を入力できるアプリケーションを構築中です。そのような言葉が自動車ブランドだとしましょう。この車のブランドに基づいて、私は各工場で労働者の数を取得したい。 PouchDBデータベースの私の構造は、各ドキュメントが1つの工場を表し、文書には労働者の数とブランド名が含まれているということです。 IDはdatetimesなので、クエリには役に立ちません。PouchDBビューの状態でユーザー入力を取得して更新する

これは私が今作成したコードです:

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」を含むすべての工場文書が返されます。しかし、私は今それを削除し、代わりに "アウディ"を書く場合、私はまだ "メルセデス"のドキュメントを取得します。関数が再び呼び出され、入力値も変わるたびに前の設計ドキュメントを削除すると思ったので、実際にはそれを取得しません。

私はここで間違っていますか?

答えて

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()}) 

しかし、残りの問題は、以前のものがすでにフィルタリングされるのに対し、それは、すべての文書を照会すること、ですマップ機能(total_rows属性が大きい)。おそらく誰かが私よりも優れた解決策を私に与えることができます。

関連する問題