gpt4 book ai didi

MongoDB mapreduce 缺失数据,返回 'null'

转载 作者:IT老高 更新时间:2023-10-28 13:32:10 25 4
gpt4 key购买 nike

所以这很奇怪。我正在尝试使用 mapreduce 在唯一端口下对日期时间/指标进行分组:

文档布局:

{
"_id" : ObjectId("5069d68700a2934015000000"),
"port_name" : "CL1-A",
"metric" : "340.0",
"port_number" : "0",
"datetime" : ISODate("2012-09-30T13:44:00Z"),
"array_serial" : "12345"
}

和mapreduce函数:

var query = {
'array_serial' : array,
'port_name' : { $in : ports },
'datetime' : { $gte : from, $lte : to}

}

var map = function() {
emit( { portname : this.port_name } , { datetime : this.datetime,
metric : this.metric });
}

var reduce = function(key, values) {
var res = { dates : [], metrics : [], count : 0}

values.forEach(function(value){
res.dates.push(value.datetime);
res.metrics.push(value.metric);
res.count++;
})

return res;
}

var command = {
mapreduce : collection,
map : map.toString(),
reduce : reduce.toString(),
query : query,
out : { inline : 1 }

}

mongoose.connection.db.executeDbCommand(command, function(err, dbres){
if(err) throw err;
console.log(dbres.documents);
res.json(dbres.documents[0].results);
})

如果请求的记录数量很少,比如 5 或 10,甚至 60,我会得到我期望的所有数据。较大的查询返回截断的值....


我刚刚做了一些测试,似乎它将记录输出限制为 100?这是每分钟的数据,当我运行 24 小时的查询时,我预计会返回 1440 条记录...我只是运行它收到了 80 条记录。:\

这是预期的吗?我没有在任何我能告诉的地方指定限制......


更多数据:

查询 2012-10-01T23:00 - 2012-10-02T00:39(100 分钟)的记录返回正确:

[
{
"_id": {
"portname": "CL1-A"
},
"value": {
"dates": [
"2012-10-01T23:00:00.000Z",
"2012-10-01T23:01:00.000Z",
"2012-10-01T23:02:00.000Z",
...cut...
"2012-10-02T00:37:00.000Z",
"2012-10-02T00:38:00.000Z",
"2012-10-02T00:39:00.000Z"
],
"metrics": [
"1596.0",
"1562.0",
"1445.0",
...cut...
"774.0",
"493.0",
"342.0"
],
"count": 100
}
}
]

...在查询 2012-10-01T23:00 - 2012-10-02T00:39(101 分钟)中再增加一分钟:

[
{
"_id": {
"portname": "CL1-A"
},
"value": {
"dates": [
null,
"2012-10-02T00:40:00.000Z"
],
"metrics": [
null,
"487.0"
],
"count": 2
}
}
]

dbres.documents 对象显示正确的预期发出记录:

[ { results: [ [Object] ],
timeMillis: 8,
counts: { input: 101, emit: 101, reduce: 2, output: 1 },
ok: 1 } ]

...那么数据是否在某个地方丢失了?

最佳答案

MapReduce 的第一条规则:

您应该从 Reduce 返回与您在 Map 中使用键发出的完全相同的格式。

MapReduce 规则二:

您应根据需要减少传递的值数组以减少多次。 Reduce 函数可能会被多次调用。

您在实现 reduce 时违反了这两条规则。

您的 Map 函数正在发出键值对。

key:端口名称(您应该简单地将名称作为键发出,而不是文档)
value:代表你需要累积的三件事(日期、度量、计数)的文档

试试这个:

map = function() {  // if you want to reduce to an array you have to emit arrays
emit ( this.port_name, { dates : [this.datetime], metrics : [this.metric], count: 1 });
}

reduce = function(key, values) { // for each key you get an array of values
var res = { dates: [], metrics: [], count: 0 }; // you must reduce them to one

values.forEach(function(value) {
res.dates = value.dates.concat(res.dates);
res.metrics = value.metrics.concat(res.metrics);
res.count += value.count; // VERY IMPORTANT reduce result may be re-reduced
})

return res;
}

关于MongoDB mapreduce 缺失数据,返回 'null',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12756487/

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