我在使用 couchdb 时遇到问题。我在 nodejs 中为此使用 nano 模块。如何实现用户名和密码匹配的搜索。我试过这个
body.rows.forEach(function(row) {
if(row.doc._id==user_id && row.doc.password==password){
found = true;
data = row;
}
});
但这是一个缓慢的过程
我在使用 couchdb 时遇到问题。我在 nodejs 中为此使用 nano 模块。如何实现用户名和密码匹配的搜索。我试过这个
body.rows.forEach(function(row) {
if(row.doc._id==user_id && row.doc.password==password){
found = true;
data = row;
}
});
但这是一个缓慢的过程
我找到了使用 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);
}
});
}
您的代码body.rows.forEach ...
是一个映射函数(它遍历每一行),它对一行执行过滤器函数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"]
您将立即获得该行。附加 a &include_docs=true
,您还将获得附加到行的整个文档(或者您可以将文档的一部分作为值而不是null
)
用户帐户,尤其是密码是机密数据。CouchDB 有内置的_users
数据库。我不会详细介绍该数据库的访问控制细节,但想说在那里存储用户帐户数据!. 如果您需要此数据库之外的帐户数据,则将该文档解释为“公共配置文件”,例如让用户发现并相互连接。