我有一个显示服务的应用程序,我希望用户能够在此服务上按服务名称进行过滤,同时始终按日期排序(降序)(不对服务名称进行排序)。
以下问题也不包含适当的解决方案:
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
答案 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和时间(反向)进行排序。