View 需要CouchDB技巧按日期排序并按组筛选

View 需要CouchDB技巧按日期排序并按组筛选,view,map,couchdb,mapreduce,View,Map,Couchdb,Mapreduce,我有“日期”和“组”字段的文档。这是我的观点: byDateGroup: { map: function(doc) { if (doc.date && doc.group) { emit([doc.date, doc.group], null); } } } 这个问题的等价查询是什么: select * from docs where group in ("group1", "group2") order by date desc 我没有想

我有“日期”和“组”字段的文档。这是我的观点:

byDateGroup: {
  map: function(doc) {
    if (doc.date && doc.group) {
      emit([doc.date, doc.group], null);
    }
  }
}
这个问题的等价查询是什么:

select * from docs where group in ("group1", "group2") order by date desc
我没有想到这个简单的解决办法(

为什么不

function(doc) {
  if (doc.date && ["group1", "group2"].indexOf(doc.group) !== -1)) {
    emit([doc.date, doc.group], null);
  }
}

您需要此特定视图:

byDateGroup1Group2: {
  map: function(doc) {
    if (doc.date && doc.group && (doc.group === "group1" || doc.group === "group2") {
      emit(doc.date, doc);
    }
  }
}

使用query
descending=true

Pankaj进行查询(可能是在列表函数中),将发出的键的顺序切换到以下位置:

emit([doc.group, doc.date], doc);
然后,您可以在查询视图时传入开始键和结束键。对要为其提取数据的每个组进行单独查询可能更容易。数据将按日期排序


我现在正在出去的路上,但如果不清楚的话,我回来后可以详细说明。

+1这似乎是最好的解决方案。从根本上说,Jangid要求加入,因此需要多次请求和“加入”回到客户端可能是最简单的事情。同意。这是目前可用的最佳方法。除了@JasonSmith所说的,您还可以在一个_列表函数中进行额外的过滤。在所有情况下,CouchDB都将“自动按”您的所有日期键(时间戳或日期数组)排序。“难的部分”只是从索引中挑出特定的组。