1

私はcouchdbを使用して問題に直面しています。これにはnodejsでnanoモジュールを使用しています。ユーザー名とパスワードの一致のような検索を実装するにはどうすればよいですか。私はこれを試しました

body.rows.forEach(function(row) {
  if(row.doc._id==user_id && row.doc.password==password){
    found = true;
    data = row;
  }
});

しかし、これは遅いプロセスです

4

2 に答える 2

4

nanoを使用して、couch dbのキー値を使用した検索の解決策を見つけました。

最初に、デザイン ドキュメントとビューを作成し (そしてその中にロジックを実装し)、それらを使用する必要があります。

exports.testwhere = function (req, res) {
   var db = nano.use('ionic');
   db.insert({
      "views": {
         "by_email_and_password": {
            "map": function (doc) {
               emit([doc.email, doc.password], doc);
            }
         }
      }
   }, '_design/users', function (error, response) {
      console.log("yay");
   });
}


exports.testsearch = function (req, res) {
   var db =
      nano.use('ionic');
   db.view('users', 'by_email_and_password', {
      key: ["a@g.com", "aaa123"], include_docs: true
   }, function (err, res) {
      if (!err) {
         console.log("Result " + JSON.stringify(res));
      }
      else {
         console.log(err);
      }
   });
}
于 2015-06-18T07:23:36.197 に答える
1

コードbody.rows.forEach ...は、行に対してフィルター関数を実行するマップ関数です (すべての行を反復処理します) if(row.doc._id==user_id ...。それが CouchDB ビューの動作です - まったく同じです。

しかし、これは遅いプロセスです

真実。そのため、CouchDB はインデックス (CouchDB のデータベース ディレクトリ内のファイルである B ツリー) を作成し、このインデックスを最新の状態に保ちます。すべてのリクエストのパフォーマンス上の利点は、例のようにジャストインタイムの計算ではなく、既に準備されたインデックスから結果が取得されることです。

CouchDB ビュー マップ関数は次のようになります。

function(doc) {
  emit([doc._id,doc.password], null)
}

すべての行のキーは[:username,:password]で、値はnullです。リクエストする場合

/:db/:ddoc/_view/:name?key=[":username",":password"]

すぐに行を取得します。a&include_docs=trueを追加すると、ドキュメント全体が行に追加されます (または、ドキュメントの一部を の代わりに値として発行することもできますnull)

CouchDB でのユーザー アカウントの処理

ユーザー アカウント、特にパスワードは機密データです。CouchDB には組み込みの_usersdb があります。そのデータベースのアクセス制御の詳細については触れませんが、そこにユーザー アカウント データを保存すると言いたいと思います。. このデータベースの外部にあるアカウント データが必要な場合は、そのドキュメントを「パブリック プロファイル」として解釈してください。たとえば、ユーザーがお互いを発見して接続できるようにするためです。

于 2015-06-14T11:49:16.647 に答える