mongodb - mongodb map-reduce 返回错误值
问题描述
几个月前我写了 map-reduce 函数,当我检查它是否按预期工作时。现在我试图用相似的数据运行相同的函数并得到奇怪的结果。
我已经在这个模拟器中测试了我的旧代码:http: //targetprocess.github.io/mongo-mapreduce-debug-online/ 它按我的预期工作。
有地图功能:
map(){
const report = {
clicks: 1
};
const baseKey = {date: this.date}
const attrs = ['country']
attrs.forEach(attr => {
let docKey = { ...baseKey, extId: this.extId, attr };
emit(docKey, { report, attrValue: this[attr]})
})
}
示例文档:
{
"_id" : ObjectId("5f86b5c240d9925e4ccab199"),
"extId" : ObjectId("5f8475154f8ee65494e5320a"),
"country" : "DE",
"date" : ISODate("2020-10-14T00:00:00Z"),
"time" : ISODate("2020-10-14T08:24:34.649Z"),
"__v" : 0
}
我尝试了最简单的reduce函数:
reduce(key, values){
return 1
}
我应该得到:
{
"_id": {
"date": "2020-10-14T00:00:00.000Z",
"extId": "5f8475154f8ee65494e5320a",
"attr": "country",
},
"value": 1
}
但我得到:
{
"_id" : {
"date" : ISODate("2020-10-14T00:00:00Z"),
"table" : ObjectId("5f8475314f8ee65494e5320b"),
"attr" : "country"
},
"value" : {
"report" : {
"clicks" : 1,
},
"attrValue" : "DE"
}
}
看起来它从发射返回值,我找不到任何未能按应有的方式返回 1 的原因。
编辑:我发现当我提供给 mapReduce 的查询与 1 个文档匹配时会发生这种情况(即使 map 函数多次发出)。当它有超过 1 个文档时,它会按预期工作。
我该如何解决?
解决方案
如果某个键只有 1 个值,MongoDB 会跳过 reduce 函数。显然我在reduce函数中做了一些错误的映射。我更改了映射的输出以匹配 reduce 输出的结构,并且它的工作方式应该如此。
推荐阅读
- c# - C# async 和 await - 什么是引人注目的用例?
- c++ - 如何将自定义类传递给 std::cout?
- android - Android:应用程序可在本地设备上运行,但未在 google play 上显示到该设备 (SEND_SMS)
- java - Maven 致命警报:protocol_version
- c++ - Qt - QLabel 不会以固定比例调整大小
- python - Python-Requests:从 git 文件夹中获取所有文件
- android - 使用 OpenCV 自动关注 Android
- git - 如何从合并中跳过 GIT 提交?
- dart - 强制 ListView 缩小以包含子项
- php - 命名空间适用于一个类,但不适用于其他类