3

我有一个包含 156 个 json 文档的 couchdb 数据库。我想在文档中找到某个值的最大值,然后发出包含该最大值的整个文档。我使用了这段代码,但它似乎不起作用。这可以帮助你理解我的意思。

function(doc) {
    var i,m;
    for (i = 0; i < doc.watchers.length; i++)
        m = Math.max(m,doc.watchers[i]);
        for (i = 0; i < doc.watchers.length; i++)
            if (m = doc.watchers[i])
                emit(doc.watchers[i], doc.watchers);
}

我还想选择具有最大值的 2 个顶级文档。

4

1 回答 1

0

仅仅使用 map 函数是行不通的,因为 map/reduce 的工作方式不能同时为 map 函数提供完整的键和值集。我会为此使用reduce函数。像这样的东西:

地图功能

function(doc) {
  var i,m;
  for (i = 0; i < doc.watchers.length; i++) {
    emit([doc._id, doc.watchers[i]], doc.watchers);
  }
}

减少功能

function(keys, values) {
  var top=0;
  var index=0;
  for (i=0;i<keys.length;i++) {
    if (keys[i][1] > top) {
      top = keys[i][1];
      index = i;
    }
  }
  return({keys[index], values[index]})
}

要使此策略起作用,您需要使用 group_level=1 进行查询,以便 couch 将按文档 id 分组的结果传递给 map 函数。我还没有测试过这个解决方案,它还没有解决你的第二个问题。如果你认为它走对了,我可以改进它。

于 2012-11-26T10:18:32.097 回答