Mapreduce couchdb-startkey-endkey不';按预期使用密钥数组筛选记录

Mapreduce couchdb-startkey-endkey不';按预期使用密钥数组筛选记录,mapreduce,couchdb,Mapreduce,Couchdb,我有一个沙发DB地图缩小视图输出这个 { rows: [ { key: [ "2014-08-20", 2, "registration" ], value: 2 }, { key: [ "2014-08-20", 2, "search" ],

我有一个沙发DB地图缩小视图输出这个

 {
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-0820和2014-0821之间的所有记录,同时我需要中间的整数值是2,最后的值是“注册”。 我的curl请求URL如下所示

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);

}


}
功能(doc){
日期=文件会话时间戳分割(“T”)[0];
eventArray=doc.events;
对于(i=0;i

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

您得到的文档的第二个数组项不同于1,因为在CouchDB中,限制(
startkey
endkey
)是使用。按照字典顺序
[1,1]<[1,2]<[2,1]<[2,2]

您需要的是多维查询(CouchDB不支持)、额外的客户端过滤(可能会增加CouchDB和您的应用程序之间传输的数据)或额外的服务器端过滤(增加查询的处理时间)


如果你的应用程序只需要在关键数组的第一个元素上使用范围进行过滤(就像在你的示例查询中一样),你可以通过将项目放在数组的最后一个位置来轻松解决问题,例如发出
[1,“注册”,“2014-08-21”]
而不是
[“2014-08-21”,1,“注册”]

Marcin-谢谢。我需要的是从2014-08-20到2014-08-21这段时间内,获取所有显示“注册”和数值1的记录。你认为这是可能的吗?Marcin-而且,当我想在中间字符串值上使用通配符时,它不起作用,甚至当我将它作为最后一个元素发出时也不起作用。例如:startkey=[1,0,“2014-08-20”]&endkey=[1,{},“2014-08-21”]您可以使用list函数筛选出查询结果。除了使用list再次查询之外,还有其他解决方案吗?列表函数是否会比单独的PHP脚本更快,后者将获取映射、减少输出和过滤?通常情况下,多维查询解决的问题在CouchDB中是很困难的。基于特定用例(例如,对预期数据的限制),通常您可以有一个有效的解决方案,可能需要更改数据结构(文档方案)。您没有提供关于您的用例的任何提示,因此我不知道如何帮助您。BASE_URL是一个常量,我用来保存指向couchdb服务器的URL。