复杂键-按第一个键过滤,仅按第二个键排序

时间:2018-09-12 17:07:26

标签: javascript node.js sorting nosql couchdb

我有一个显示服务的应用程序,我希望用户能够在此服务上按服务名称进行过滤,同时始终按日期排序(降序)(不对服务名称进行排序)。

以下问题也不包含适当的解决方案:

Couch DB filter by key and sort by another field

以下是该代码的简化版本,可让我大致了解我正在尝试的内容(serviceName必须是第一个键,因为我不能仅使用第二个键进行过滤):

function(doc) { 
    if(doc.type && doc.type=="incident"){
        emit([doc.serviceName, doc.date], doc)
    }
 };

这是一个片段,其中从我在Node中编写的API中构建了查询参数:

if (req.query.search !== "") {
    const search = req.query.search;
    params = { 
        limit: limit, 
        skip: skip, 
        startkey: [search+"Z"], 
        endkey: [search], 
        descending:true, 
        include_docs: true 
    };
} else {
    params = { limit: limit, skip: skip, descending:true, include_docs: true };

以上代码当前过滤服务名称,但在按日期排序之前,还按服务名称排序。我可以添加什么内容(请参见下面的代码段),以强制查询按日期对结果进行排序,而无需在获得结果后在代码中进行处理。

const sort = [{'date': 'desc'}];

按服务名过滤时,我想要的是这样的

SELECT * FROM incidents
    WHERE serviceName LIKE @search+'%'
    ORDER BY date DESC

但不按服务名称过滤时:

SELECT * FROM incidents
ORDER BY date DESC

1 个答案:

答案 0 :(得分:2)

一种执行此操作的方法是确保您发出的数组的第二个元素(与日期相关的位)随着时间的流逝而下降。这可以通过对地图功能进行一些修改来实现

function(doc) {
  if(doc.type && doc.type=="incident") {

     // get the date from the document
     var d = doc.date;

     // remove dash characters
     var d1 = d.replace(/\-/g,'');

     // convert to integer
     var d2 = parseInt(d1)

     // Subtract from number representing the year 3000
     emit([doc.serviceName, 30000000 - d2], doc)
  }
}

您现在可以按升序查询此视图(没有descending=true),并且数据将按serviceName和时间(反向)进行排序。

相关问题