让 couchDB 计算平均值并在添加值时保持最新
make couchDB calculate an average and keep it up to date when adding values
是否可以让 couchDB (Cloudant) 计算每个文档的平均 rating
值?
如果是,如何在 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": ...
}
以及如何在添加评级时使此 averageRating 保持最新?
添加的评分如下所示:
"2016-02-06T17:57:04.671Z": {
"userEmail": "loin@yaoo.fr",
"rating": 2,
"sessionNumber": 10
}
CouchDB 不在文档中计算字段。但是,map/reduce 非常适合增量计算,因为 CouchDB 的 map/reduce 计算非常高效。 (您可以阅读更多关于他们的设计决策及其对性能的影响 here)
我的建议是为每个评级创建单独的文档:
{
"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
(这似乎是您的键)
对评分进行分组
function (doc) {
emit(doc.modelStrict, doc.rating);
}
然后,你可以使用一个reduce函数来计算平均值:(我修改了reduce函数从here
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]
}
}
当您调用此视图时,您将获得 [ 3, 4 ]
,这是平均值以及用于计算该平均值的值的数量。我相信你需要 return 两者,所以 reduce
和 rereduce
都有足够的上下文来进行计算,只是那些奇怪的 CouchDB 主义之一。
随着您越来越多地使用 CouchDB,您会发现自己正在使用更多的文档,而不是将很多文档合并到同一个文档中。这使得编写视图更加灵活并且磁盘使用效率更高,但当然可以尝试最适合您自己的应用程序的方法。希望对您有所帮助!
是否可以让 couchDB (Cloudant) 计算每个文档的平均 rating
值?
如果是,如何在 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": ...
}
以及如何在添加评级时使此 averageRating 保持最新?
添加的评分如下所示:
"2016-02-06T17:57:04.671Z": {
"userEmail": "loin@yaoo.fr",
"rating": 2,
"sessionNumber": 10
}
CouchDB 不在文档中计算字段。但是,map/reduce 非常适合增量计算,因为 CouchDB 的 map/reduce 计算非常高效。 (您可以阅读更多关于他们的设计决策及其对性能的影响 here)
我的建议是为每个评级创建单独的文档:
{
"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
(这似乎是您的键)
function (doc) {
emit(doc.modelStrict, doc.rating);
}
然后,你可以使用一个reduce函数来计算平均值:(我修改了reduce函数从here
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]
}
}
当您调用此视图时,您将获得 [ 3, 4 ]
,这是平均值以及用于计算该平均值的值的数量。我相信你需要 return 两者,所以 reduce
和 rereduce
都有足够的上下文来进行计算,只是那些奇怪的 CouchDB 主义之一。
随着您越来越多地使用 CouchDB,您会发现自己正在使用更多的文档,而不是将很多文档合并到同一个文档中。这使得编写视图更加灵活并且磁盘使用效率更高,但当然可以尝试最适合您自己的应用程序的方法。希望对您有所帮助!