gpt4 book ai didi

javascript - 计算 MapReduce 中最后 X 个文档的平均值

转载 作者:行者123 更新时间:2023-12-03 09:44:08 24 4
gpt4 key购买 nike

我什至知道mapreduce是否是满足我需要的最佳选择。我有一个像这样的 Mongoose 文档:

currency { 
Time: Date,
Interval: Number
}

在我的mapreduce作业中,我想计算最后X个文档的平均价格(间隔)。 (包括当前)。

如果我将 20 传递给我的方法,我希望对于每个文档,计算最后 19 + 当前文档的值除以 20。任何正确方向的建议或指示将不胜感激。这就是我想要实现的目标:

function calculateAverages(Schema, interval, avg, callback){
v
var o = {};
o.scope = {interval: interval, avg: avg};

o.map = function(){

var value = {
Time: this.Date,
Interval: this.Interval

};

// How am I gonna group the correct number of docs togheter?
var key= ??

emit(key, value);


};
// an array of avg ( ex 20) number of items should be passed here
o.reduce = function(key, intervals){
var reducedVal = { avg: 0};

for(var i=0;i<intervals.length;i++){
reducedVal.avg += intervals[i].Interval;
}
reducedVal.avg /= avg;
return reducedVal;
};

o.out = {
merge: "testing"
};
o.finalize = function(key, reducedVal){
return reducedVal;
};

Schema.mapReduce(o, function (err, results) {
if (err) throw err;

//console.log(results);
console.log("mapReduce complete");

callback(results);
});
};

最佳答案

您可以使用简单的聚合管道来获取平均值,管道将遵循以下步骤

  1. 按时间字段对文档进行排序
  2. 限制文档数量
  3. 对文档进行分组并获取平均值

您可以尝试下面的代码,它只是创建货币模型并向 mongodb 发送聚合查询,结果显示在控制台上,您的集合应该在 mongodb 服务器上命名为货币。

var mongoose = require('mongoose');
var db = mongoose.connection;
mongoose.connect('mongodb://localhost/test');

var CurrencySchema = mongoose.Schema({
Time: Date,
Interval: Number
}, {collection: 'currency'});

var Currency = mongoose.model('Currency', CurrencySchema);
// You can change the $limit to specify the number of document

db.once('open', function (callback) {
var pipeline = [
{$sort: {Time : -1 }},
{$limit: 5},
{$group: {_id: null, average : {$avg: "$Interval"}}}
];

Currency.aggregate(pipeline).exec(function(err, data) {
console.log(data);
});
});

关于javascript - 计算 MapReduce 中最后 X 个文档的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com