Couchdb使用nano,如何编写搜索查询

时间:2015-06-13 04:49:01

标签: couchdb couchdb-nano

我使用couchdb遇到问题。我在nodejs中使用nano模块。如何实现匹配用户名和密码等搜索。我试过这个

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

但这是一个缓慢的过程

2 个答案:

答案 0 :(得分:3)

我使用nano在沙发数据库中找到了使用键值的搜索解决方案。

首先,您必须创建设计文档和视图(并实现 然后使用它们。

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

答案 1 :(得分:1)

您的代码body.rows.forEach ...是一个map函数(它遍历每一行),它对一行执行过滤函数if(row.doc._id==user_id ...。这就是CouchDB的观点所做的 - 完全相同。

  

但这是一个缓慢的过程

真。因为CouchDB创建了一个索引(一个B-Tree,它是CouchDB数据库目录中的一个文件),并使该索引保持最新。每个请求的性能优势是结果将取自已准备好的索引,而不是像您的示例中那样的即时计算。

CouchDB视图映射功能可能如下所示:

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

每行的关键字为[:username,:password],值为null。如果您要求

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

您将立即获得该行。附加一个&include_docs=true,您还会将整个文档附加到该行(或者您可以将文档的一部分作为值而不是null发出)

在CouchDB中处理用户帐户

用户帐户,尤其是密码是机密数据。 CouchDB有内置的_users db。我不会详细介绍该数据库的访问控制细节,但想说存储用户帐户数据!。如果您需要此数据库之外的帐户数据,请将该文档解释为“公共配置文件”,例如让用户发现并相互联系。