如何在 CouchDB 和 NodeJS 中使用 map/Reduce 改进视图



我正在使用带有模块底座的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 索引的强大功能与keystartkeyendkey查询参数一起使用,并发出您希望搜索的字段作为键值。

其次,您的示例可以轻松转换为:

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文档。

相关内容

  • 没有找到相关文章

最新更新