У Джеймса отличный ответ.
Похоже, вы задаете вопрос "Каковы значения документов типа X?"
Я думаю, что выможно сделать это с одним представлением:
function(doc) {
// _view/sensor_value
var val_names = { "sensorX": "valueA"
, "sensorY": "valueB"
, "sensorZ": "valueC"
};
var value_name = val_names[doc.type];
if(value_name) {
// e.g. "sensorX" -> "123"
// or "sensorZ" -> "789"
emit(doc.type, doc.value[value_name]);
}
}
Теперь, чтобы получить все значения для sensorY
, вы запрашиваете /db/_design/app/_view/sensor_value
с параметром ?key="sensorX"
.CouchDB покажет все значения для sensorX, которые получены из поля value.valueA
документа.(Для датчика Y это value.valueB
и т.быть лучше:
function(doc) {
if(doc.type && doc.value) {
emit(doc.type, doc.value);
}
}
Это очень просто, и любой документ будет работать, если у него есть поля type
и value
.Затем, чтобы получить valueA
, valueB
и т. Д., Просто сделайте это на стороне клиента.
Если использование клиента невозможно, используйте функцию _list
.
function(head, req) {
// _list/sensor_val
//
start({'headers':{'Content-Type':'application/json'}});
// Updating this will *not* cause the map/reduce view to re-build.
var val_names = { "sensorX": "valueA"
, "sensorY": "valueB"
, "sensorZ": "valueC"
};
var row;
var doc_type, val_name, doc_val;
while(row = getRow()) {
doc_type = row.key;
val_name = val_names[doc_type];
doc_val = row.value[val_name];
send("Doc " + row.id + " is type " + doc_type + " and value " + doc_val);
}
}
Очевидно, используйте send()
для отправки любого формата, который вы предпочитаете для клиента (например, JSON).