couchdb排序和计数

couchdb排序和计数,couchdb,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", n

我想在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}
}


或者类似的东西。

最简单的方法是使用map函数,该函数为每个文档发出该文档中的
食品
项目集:

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}
]}
但是我们可以使用reduce步骤让couchdb为我们添加所有密钥。计算每个项是一项非常常见的任务,它有一个特殊的erlang实现,只需使用“
\u count
”作为reduce函数,然后在使用视图时,使用
group=true
告诉它分别为每个不同的键执行reduce步骤

$ 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}
]}

在StackOverflow上,您应该描述您首先尝试了什么。这里有一个提示:您的
映射
函数将创建一个索引,每个食物项目都作为
,您的
减少
函数将为每个
@user2898796计算行数:如果您发现我的答案解决了您的问题,请单击复选框接受它