0

我正在使用带有模块摇篮的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
  }
});

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

4

1 回答 1

1

首先,您的观点是错误的。视图首先是索引,您不应该将它们用于全扫描操作 - 这是无效和错误的。使用 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查询参数来获取它。

于 2014-03-29T15:03:26.640 回答