使couchDB计算平均值,并在添加值时使其保持最新

使couchDB计算平均值,并在添加值时使其保持最新,couchdb,cloudant,Couchdb,Cloudant,是否可以让couchDB(Cloudant)计算每个文档的平均评级值? 如果是,如何在Cloudant中执行此操作 谢谢 { "_id": "2016-02-06T13:16:30.515Z", "_rev": "3-7521b9e21fbb58d5393a76d08b12ab12", "modelStrict": "Taj model", "ratings": { "2016-02-06T13:36:04.671Z": { "userEmail": "lou

是否可以让couchDB(Cloudant)计算每个文档的平均
评级
值?
如果是,如何在Cloudant中执行此操作

谢谢

{
  "_id": "2016-02-06T13:16:30.515Z",
  "_rev": "3-7521b9e21fbb58d5393a76d08b12ab12",
  "modelStrict": "Taj model",
  "ratings": {
    "2016-02-06T13:36:04.671Z": {
      "userEmail": "lourain@yaho.fr",
      "rating": 1,
      "sessionNumber": 0
    },
    "2016-02-06T13:46:04.671Z": {
      "userEmail": "louin@yaoo.fr",
      "rating": 3,
      "sessionNumber": 0
    },
    "2016-02-06T13:53:04.671Z": {
      "userEmail": "luin@yaoo.fr",
      "rating": 3,
      "sessionNumber": 0
    }, 
    "2016-02-06T13:47:04.671Z": {
      "userEmail": "loin@yaoo.fr",
      "rating": 5,
      "sessionNumber": 0
    }
  },
  "averageRating": ...
}
当增加评级时,如何使平均值保持最新

添加的评级如下所示:

    "2016-02-06T17:57:04.671Z": {
      "userEmail": "loin@yaoo.fr",
      "rating": 2,
      "sessionNumber": 10
    }

CouchDB不在文档中执行计算字段。然而,map/reduce非常适合以增量方式进行此计算,因为CouchDB的map/reduce计算非常有效。(您可以阅读更多有关其设计决策及其对性能的影响的信息)

我的建议是为每个评级创建单独的文件:

{
  "modelStrict": "Taj model",
  "datetime": "2016-02-06T13:36:04.671Z",
  "userEmail": "lourain@yaho.fr",
  "rating": 1,
  "sessionNumber": 0
}

{
  "modelStrict": "Taj model",
  "datetime": "2016-02-06T13:46:04.671Z",
  "userEmail": "louin@yaoo.fr",
  "rating": 3,
  "sessionNumber": 0
}

{
  "modelStrict": "Taj model",
  "datetime": "2016-02-06T13:53:04.671Z",
  "userEmail": "luin@yaoo.fr",
  "rating": 3,
  "sessionNumber": 0
}

{
  "modelStrict": "Taj model",
  "datetime": "2016-02-06T13:47:04.671Z",
  "userEmail": "loin@yaoo.fr",
  "rating": 5,
  "sessionNumber": 0
}
然后,您可以使用这样的映射函数,它将根据
modelStrict
对评级进行分组(这似乎是您的键)

然后,您可以使用reduce函数来计算平均值:(我修改了

调用此视图时,您将得到
[3,4]
,这是平均值以及用于计算该平均值的值的数量。我认为您需要同时返回这两个值,以便
reduce
reduce
都有足够的上下文进行计算,这只是那些奇怪的CouchDB语句之一


随着您越来越多地使用CouchDB,您会发现自己使用了更多的文档,而不是将很多文档合并到同一个文档中。这使得编写视图更加灵活,磁盘使用效率也更高,但当然,您可以尝试一下最适合您自己的应用程序的方法。我希望这会有所帮助!

它与Couchbase有什么关系?CouchDB是c完全不同的产品。您应该删除[couchbase]标签
function (doc) {
  emit(doc.modelStrict, doc.rating);
}
function(keys, values, rereduce) {
    if (!rereduce) {
        var length = values.length
        return [sum(values) / length, length]
    } else {
        var length = sum(values.map(function(v){return v[1]}));
        var avg = sum(values.map(function(v){
            return v[0] * (v[1] / length)
        }));
        return [avg, length]
    }
}