2012-11-21 33 views
3

我有一个包含156个json文档的couchdb数据库。我想在文档中找到某个值的最大值,然后发出包含该最大值的整个文档。我用这个代码,但它似乎没有工作。这可能会帮助你理解我的意思。选择一个值在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个具有最大值的顶级文档。

+0

如果“if”使用了==而不是=,这会起作用吗? – grantwparks

回答

0

只使用map函数将不起作用,因为map/reduce工作方式不能同时向map函数提供完整的一组键和值。 我会使用减少功能。事情是这样的:

地图功能

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

Reduce函数

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来查询,这样的沙发将结果传递按文件ID分组到地图功能。 我还没有测试过这个解决方案,但它并没有解决你的第二个问题。如果你认为它是正确的,我可以改进它。