我正在使用带有模块底座的nodejs与couchdb服务器进行交互,问题是让我了解reduce过程以改进视图查询...
例如,我应该使用如下视图从他的 ID 中获取用户数据:
map: function (doc) { emit(null, doc); }
在节点.js(带底座):
db.view('users/getUserByID', function (err, resp) {
var found = false;
resp.forEach(function (key, row, id) {
if (id == userID) {
found = true;
userData = row;
}
});
if (found) {
//good, works
}
});
如您所见,这对于大量文档(数据库中的用户)来说真的很糟糕,所以我需要使用reduce来改进此视图,但我不知道如何,因为我不了解reduce的工作原理。
首先,你做错了观点。View 首先是索引,您不应该将它们用于完全扫描操作 - 这是无效和错误的。将 Btree 索引的强大功能与key
、startkey
和endkey
查询参数一起使用,并发出您希望搜索的字段作为键值。
其次,您的示例可以轻松转换为:
db.get(userID, function(err, body) {
if (!err) {
// found!
}
});
因为在循环中,您正在使用用户 ID 值检查行的文档 ID。不需要那个循环 - 您可以直接通过他的ID请求文件。
第三,如果您的 userID 值与文档的 ID 不匹配,则您的视图应为:
function (doc) { emit(doc.userID, null); }
您的代码将如下所示:
db.view('users/getUserByID', {key: userID}, function (err, resp) {
if (!err) {
// found!
}
});
简单。有效。快。如果需要匹配的文档,请使用查询参数获取include_docs: true
文档。