CouchDB 查询日期
CouchDB Querying Dates
我正在 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]}
]}
那是因为你不明白couchDB是如何处理键的。 couchDB 的键是列表中的一个位置(实际上是一棵树,但列表的参数是相同的)所以当你说你想从 ["a",2015,9,1,0]
开始时,couchDB 从列表中的那个位置开始(结果你如果您未指定任何键,则获取,然后从该点向前移动,直到到达 ["z",2015,10,1,0]
处的结束键。CouchDB 从左到右匹配数组,因此 ["a",foo]
将始终出现在 [= 之前13=] 对所有 foo, bar.
如果您希望能够在某个日期过滤结果,我建议您将函数更改为 `emit([d.getFullYear(),d.getMonth() + 1,d.getDate(), d.getHours(), doc.path[i]], +doc.temp);
而且,如果您希望能够有时过滤房间,有时过滤日期,则为每个房间创建一个视图,在 couchDB 中视图真的很便宜。
`
我正在 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]}
]}
那是因为你不明白couchDB是如何处理键的。 couchDB 的键是列表中的一个位置(实际上是一棵树,但列表的参数是相同的)所以当你说你想从 ["a",2015,9,1,0]
开始时,couchDB 从列表中的那个位置开始(结果你如果您未指定任何键,则获取,然后从该点向前移动,直到到达 ["z",2015,10,1,0]
处的结束键。CouchDB 从左到右匹配数组,因此 ["a",foo]
将始终出现在 [= 之前13=] 对所有 foo, bar.
如果您希望能够在某个日期过滤结果,我建议您将函数更改为 `emit([d.getFullYear(),d.getMonth() + 1,d.getDate(), d.getHours(), doc.path[i]], +doc.temp);
而且,如果您希望能够有时过滤房间,有时过滤日期,则为每个房间创建一个视图,在 couchDB 中视图真的很便宜。 `