使用复杂键的过滤器不起作用(使用开始键和结束键)

时间:2018-06-20 01:53:14

标签: view couchdb

我使用Map函数创建视图:

r = r.replace("true", "True")

我想用多键过滤数据:

r = r.replace("True", "true")

但我仍然得到:

function(doc) {
    if (doc.market == "m_warehouse") {
        emit([doc.logTime,doc.dbName,doc.tableName], 1);
    }
}

_design/select_data/_view/new-view/?limit=10&skip=0&include_docs=false&reduce=false&descending=true&startkey=["2018-06-19T09:16:47,527","stage"]&endkey=["2018-06-19T09:16:43,717","stage"] 不应出现在结果中。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的查询是 not 多键.. ist的开始和结束键。 如果要在特定时间范围内按dbname获得结果,则需要将发射更改为[doc.dbName,doc.logTime,doc.tableName]

然后您查询startkey = [“ stage”,“ 2018-06-19T09:16:43,717”]&endkey = [“ stage”,“ 2018-06-19T09:16:47,527”]

(顺便说一句,您确定时间戳正确吗?在您的示例中,第二个TS大于第一个。)

答案 1 :(得分:0)

由于您已经选择了完整的日期/时间戳作为密钥的第一级(精确到毫秒),因此复合密钥的第一级中不可能有重复的值。如果仅索引日期,例如,作为第一个键,则日期将以更可预测的方式按日期,dbame和表名分组

例如

["2018-06-19","ods","o_ad_dsp_pvlog_realtime"]
["2018-06-19","stage","s_ad_ztc_realpv_base_indirect"]
["2018-06-19",stage","s_ad_ztc_realpv_base_indirect"
["2018-06-19","stage","s_ad_ztc_realpv_base_indirect"

使用此键结构,键的分层分组会为您所用,即来自“ 2018-06-19”的所有数据都在索引中,并且所有数据都匹配[“ 2018-06-19”,”阶段”]彼此相邻。

如果需要达到毫秒精度,则可以按以下方式索引数据:

function(doc) {
    if (doc.market == "m_warehouse") {
        emit([doc.dbName,doc.logTime], 1);
    }
}

这将创建由dbName组织的索引,但按时间进行次要排序。然后,您可以在两个时间戳之间提取指定dbName的数据。