如何在couchdb和nodejs中使用map / reduce改进视图

时间:2014-03-29 14:20:58

标签: node.js view mapreduce couchdb cradle

我使用带模块底座的nodejs与couchdb服务器进行交互,问题是让我了解reduce进程以改进视图查询......

例如,我应该使用以下视图从他的ID获取用户数据:

map: function (doc) { emit(null, doc); }

在node.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
  }
});

正如您所看到的,这对于大量文档(数据库中的用户)来说真的很糟糕,所以我需要通过减少来改进这个视图但我不知道如何因为我没有了解减少工作..谢谢

1 个答案:

答案 0 :(得分:1)

首先,你做错了。 View首先是索引,你不应该将它们用于全扫描操作 - 这是无效和错误的。使用Btree索引的强大功能与keystartkeyendkey查询参数以及您想要搜索的字段作为键值。

第二,您的示例可以很容易地转换为:

db.get(userID, function(err, body) {
    if (!err) {
      // found!
    }
});

因为在你的循环中你用你的userID值检查行的文档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查询参数来获取它。