couchdb - startkey endkey不按预期过滤具有键阵列的记录

时间:2014-09-04 08:43:46

标签: mapreduce couchdb

我有Couch-DB map-reduce视图输出;

 {
rows: [
    {
        key: [
            "2014-08-20",
            2,
            "registration"
        ],
        value: 2
    },
    {
        key: [
            "2014-08-20",
            2,
            "search"
        ],
        value: 3
    },
    {
        key: [
            "2014-08-21",
            2,
            "registration"
        ],
        value: 3
    },
    {
        key: [
            "2014-08-21",
            2,
            "search"
        ],
        value: 4
    }
]
}

我需要查询2014-08-20和2014-08-21之间的所有记录。同时我需要中间的整数值为2,最后一个值为“registration”。< / p>

我的卷曲请求网址如下所示

BASE_URL?group=true&startkey=["2014-08-20",1,"registration"]
&endkey=["2014-08-21",1,"registration"]

这会过滤掉日期,但不会过滤其他元素(整数值和字符串)。有人知道发生了什么事吗?

任何帮助都将不胜感激。

更新

我的文档结构看起来像这样

[
    {
        platform_version: 2,
        UDID: "EWHSJeNp20sBFuzqcorkKVVi",
        session: {
            timestamp: "2014-08-20T00:00:00.000Z",
            session_id: "kOnNIhCNQ31LlkpEPQ7XnN1D",
            ip: "202.150.213.66",
            location: "1.30324,103.5498"
        },
        events: [
            {
                event_type: "search",
                timestamp: "2014-08-21T00:00:00.000Z",
                location: "1.30354,103.5301",
                attributes: {

                }
            }
        ]
    },
    {
        platform_version: 2,
        UDID: "EWHSJeNp20sBFuzqcorkKVVi",
        session: {
            timestamp: "2014-08-21T00:00:00.000Z",
            session_id: "kOnNIhCNQ31LlkpEPQ7XnN1D",
            ip: "202.150.213.66",
            location: "1.30324,103.5498"
        },
        events: [
            {
                event_type: "search",
                timestamp: "2014-08-21T00:00:00.000Z",
                location: "1.30354,103.5301",
                attributes: {

                }
            }
        ]
    },
    {
        platform_version: 2,
        UDID: "EWHSJeNp20sBFuzqcorkKVVi",
        session: {
            timestamp: "2014-08-20T00:00:00.000Z",
            session_id: "kOnNIhCNQ31LlkpEPQ7XnN1D",
            ip: "202.150.213.66",
            location: "1.30324,103.5498"
        },
        events: [
            {
                event_type: "click",
                timestamp: "2014-08-21T00:00:00.000Z",
                location: "1.30354,103.5301",
                attributes: {

                }
            }
        ]
    }
]

并且map reduce函数看起来像这样。

function(doc) {

date = doc.session.timestamp.split("T")[0];
eventArray = doc.events;
for (i = 0; i < eventArray.length; i++) { 

    emit([doc.app_version,eventArray[i].event_type,date],1);

}


}

我改变了键的顺序后开始工作了。但是,我仍然不能使用通配符来查询所有事件类型。

1 个答案:

答案 0 :(得分:3)

您正在获取具有不同于第二个数组项的文档,因为在CouchDB中,使用lexicographical order将限制(startkeyendkey)与地图键进行比较。在字典顺序[1,1] < [1,2] < [2,1] < [2,2]

您需要的是多维查询(CouchDB不支持),额外的客户端过滤(可能会增加CouchDB与您的应用之间传输的数据)或使用list function进行额外的服务器端过滤(增加查询的处理时间)。

如果你的应用只需要在键数组的第一个元素上使用范围进行过滤(就像在你的示例查询中一样),你可以通过将项放在数组的最后位置来轻松解决问题,例如。发出[1, "registration", "2014-08-21"]代替["2014-08-21", 1, "registration"]