我有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);
}
}
我改变了键的顺序后开始工作了。但是,我仍然不能使用通配符来查询所有事件类型。
答案 0 :(得分:3)
您正在获取具有不同于第二个数组项的文档,因为在CouchDB中,使用lexicographical order将限制(startkey
和endkey
)与地图键进行比较。在字典顺序[1,1] < [1,2] < [2,1] < [2,2]
。
您需要的是多维查询(CouchDB不支持),额外的客户端过滤(可能会增加CouchDB与您的应用之间传输的数据)或使用list function进行额外的服务器端过滤(增加查询的处理时间)。
如果你的应用只需要在键数组的第一个元素上使用范围进行过滤(就像在你的示例查询中一样),你可以通过将项放在数组的最后位置来轻松解决问题,例如。发出[1, "registration", "2014-08-21"]
代替["2014-08-21", 1, "registration"]
。