我在CouchDB中收集温度,并希望按房间,年,月,日,小时查询平均温度。不幸的是,当我执行我的查询(见下文)时,我得到了所有月份,而不仅仅是我在查询中指定的月份。但是,如果我只指定一个房间,我只得到我在查询中指定的月份。如何查询指定时间段内的所有房间?
地图功能:
function(doc) {
if(doc.type == "TempHumid"){
var d = new Date(doc.datetime);
for(var i in doc.path)
emit([doc.path[i], d.getFullYear(),d.getMonth() + 1,d.getDate(), d.getHours()], +doc.temp);
}
}

减少功能
function(keys, values, rereduce) {
var avg, length;
if (!rereduce){
length = values.length
var total = sum(values)
avg = parseFloat(total / length).toFixed(2)
}else{
length = sum(values.map(function(v){return v[1]}))
avg = parseFloat(sum(values.map(function(v){
return v[0] * (v[1] / length)
}))).toFixed(2)
}
return [avg, length]
}

查询所有房间:
http://127.0.0.1:5984/dev_data_v2/_design/views/_view/avg_temp?reduce=true&group_level=3&startkey=["a",2015,9,1,0]&endkey=["z",2015,10,1,0]

查询结果:
{"rows":[
{"key":["Bedroom 1",2015,9],"value":["73.63",2292]},
{"key":["Home",2015,8],"value":["75.27",1476]},
{"key":["Home",2015,9],"value":["74.59",14859]},
{"key":["Bedroom 2",2015,8],"value":["81.16",8]},
{"key":["Bedroom 2",2015,9],"value":["73.88",2964]},
{"key":["Kitchen",2015,9],"value":["74.44",3352]},
{"key":["Main Level",2015,9],"value":["74.43",3352]},
{"key":["Bedroom 3",2015,8],"value":["75.35",705]},
{"key":["Bedroom 3",2015,9],"value":["75.72",3270]},
{"key":["Office",2015,8],"value":["75.14",763]},
{"key":["Office",2015,9],"value":["74.98",2981]},
{"key":["Upstairs",2015,8],"value":["75.27",1476]},
{"key":["Upstairs",2015,9],"value":["74.64",11507]}
]}

查询所有房间:
http://127.0.0.1:5984/dev_data_v2/_design/views/_view/avg_temp?reduce=true&group_level=3&startkey=["Bedroom 2",2015,9,1,0]&endkey=["Bedroom 2",2015,10,1,0]

查询结果:
{"rows":[
{"key":["Bedroom 2",2015,9],"value":["73.88",2964]}
]}

答案 0 :(得分:2)
这是因为你不了解couchDB如何处理密钥。 couchDB的一个键是列表中的位置(实际上是一个树,但列表的参数相同)所以当你说要从["a",2015,9,1,0]
开始时,couchDB从列表中的那个位置开始(结果你得到,如果你没有指定任何键,然后从那一点向前移动,直到它到达["z",2015,10,1,0]
的结束键.CouchDB从左到右匹配数组,所以["a",foo]
将始终到来所有foo的["b",bar]
,bar。
如果您希望能够在某个日期过滤结果,我建议您将函数更改为`emit([d.getFullYear(),d.getMonth()+ 1,d.getDate(), d.getHours(),doc.path [i]],+ doc.temp);
如果您希望能够有时过滤房间和其他时间日期为每个房间创建一个视图,那么在couchDB中视图真的很便宜。 `