2013-11-16 4 views
0

Я пытаюсь получить некоторую статистику в couchDB. Структура документовcouchdb сортировка и подсчет

[{ 
    _id: "1", 
    name: "Hotel A", 
    type: "hotel", 
    stars: 3, 
    flags: ["family-friendly","pet-friendly","green-hotel","sport"], 
    hotelType: "premium", 
    food: ["breakfast","lunch"] 
}, { 
    _id: "2", 
    name: "Hotel B", 
    type: "hotel", 
    stars: 4, 
    flags: ["family-friendly","pet-friendly"], 
    hotelType: "budget", 
    food: ["breakfast"] 
}, { 
    _id: "3", 
    name: "Hotel C", 
    type: "hotel", 
    stars: 5, 
    flags: ["family-friendly","pet-friendly"], 
    hotelType: "budget", 
    food: ["breakfast","lunch","dinner"] 
}] 

Как я могу получить, сколько гостиниц есть «завтрак», «обед», «ужин» и сортировать его? Я хотел бы получить ответ, как этот

{{breakfast:3},{lunch:2},{dinner:1} 

}

или что-то подобное.

+0

На StackOverflow вы должны сначала описать, что вы пробовали. Вот подсказка: ваша функция «map» создаст индекс с ** каждым ** продуктом питания как «ключ», а ваша функция 'reduce' будет ** подсчитывать ** строки для каждой« группы ». –

ответ

2

самое простое, что нужно сделать, это использовать функцию карты, которая излучает, для каждого документа, набор food элементов в этом документе:

function (doc) { 
    doc.food.forEach(function (item) { 
    emit(iten, null)}); 
} 

Каждый ключ в индексе является теперь только пищевой продукт. У вас будет один ключ для каждого отеля и пункт питания. До сих пор это выглядит немного болтливый:

$ curl -s 'http://localhost:5984/hotels/_design/so/_view/foods?reduce=false' 
{"total_rows":6,"offset":0,"rows":[ 
{"id":"1","key":"breakfast","value":null}, 
{"id":"2","key":"breakfast","value":null}, 
{"id":"3","key":"breakfast","value":null}, 
{"id":"3","key":"dinner","value":null}, 
{"id":"1","key":"lunch","value":null}, 
{"id":"3","key":"lunch","value":null} 
]} 

Но мы можем получить CouchDB сложить все ключи для нас с помощью уменьшения шага. Подсчет каждого элемента - такая общая задача, что у него есть специальная реализация erlang, просто используйте «_count» для функции уменьшения, а затем, используя представление, используйте group=true, чтобы сообщить ему выполнить шаг восстановления отдельно для каждого отдельного ключа.

$ curl -s 'http://localhost:5984/hotels/_design/so/_view/foods?group=true' 
{"rows":[ 
{"key":"breakfast","value":3}, 
{"key":"dinner","value":1}, 
{"key":"lunch","value":2} 
]} 
+0

все нормально работает! Спасибо. –

+0

@ user2898796: если вы нашли, что мой ответ решил вашу проблему, пожалуйста, примите его, установив флажок – SingleNegationElimination

Смежные вопросы