MongoDB映射减少产生奇怪结果

MongoDB映射减少产生奇怪结果,mongodb,mapreduce,Mongodb,Mapreduce,我正在MongoDB(c#驱动程序)中实现一个简单的“获取最大值”映射reduce。 对于我的测试,我在一个集合中有10个项,int _id=1到10 我的地图和地图如下: var map = "function() {emit('_id', this.Id);}"; var reduce = "function(key, values) {var max = 1; for (id in values) {if(id>max) {max=id;}} } return max;}"; 但是

我正在MongoDB(c#驱动程序)中实现一个简单的“获取最大值”映射reduce。 对于我的测试,我在一个集合中有10个项,int _id=1到10

我的地图和地图如下:

var map = "function() {emit('_id', this.Id);}";
var reduce = "function(key, values) {var max = 1; for (id in values) {if(id>max) {max=id;}} } return max;}";
但是当我跑的时候我得到了结果9,奇怪

我认为map正在输出一个字符串,因此比较没有按预期工作。
如果值只包含一项,则Reduce函数将不会运行。如果所有id都是唯一的,并且您在映射中的键仅为该id,则由于设计问题(为了提高性能),reduce阶段将不起作用。如果需要更改reduce输出的格式,应使用
finalize
方法。或者看看
聚合框架
,它提供了非常有用的数据处理工具

检查一下jira

jira.mongodb.org/browse/SERVER-5818

如果您只是想熟悉map reduce,我建议您尝试使用map reduce真正有意义的不同场景


干杯

你能确保你的数据(Id字段)实际上是一个数字而不是一个字符串吗?看起来真的像是字符串之间的比较,而不是数字。你所有的Id都是唯一的吗?Reduce函数不会运行,因为它需要值中有一个数组,而当一个键只有一个项时,Reduce函数就不会运行。因此,我怀疑您有多个id为9的项目。_id是一个int。我已经检查了mongo shell,并且_id=10被定义为“_id”:10如果所有id都是唯一的,并且您在地图中的密钥仅为该id,则由于设计问题,reduce阶段将无法工作。如果您只是想熟悉map reduce,请查看jira。我建议您尝试使用map reduce真正有意义的不同场景。