`
chenzhou123520
  • 浏览: 4259258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mongodb MapReduce Error:'out' has to be a string or an object

阅读更多

最近在学习Mongodb,作为入门,选择了《Mongodb权威指南》这本书来进行参考学习。目前看到了MapReduce,由于我用的版本比较新,发现了和书上有些不同的地方。

 

应用场景:

使用MapReduce找出一个集合中所有的键的个数,mongo shell代码如下:

定义map function:

map = function () {
    for (var key in this) {
        emit(key, {count:1});
    }
}

定义reduce function:

reduce = function (key, emits) {
    total = 0;
    for (var i in emits) {
        total += emits[i].count;
    }
    return {count:total};
}

执行MapReduce操作:

mr = db.runCommand({"mapreduce":"users","map":map,"reduce":reduce})

以上都是书上的代码,但是执行后没有正常返回,而是返回了如下结果:

{
	"assertion" : "'out' has to be a string or an object",
	"assertionCode" : 13606,
	"errmsg" : "db assertion failure",
	"ok" : 0
}

网上百度了下才知道原来1.8以上的版本需要指定out的输出

修改了执行MapReduce命令后执行正常,命令如下:

mr = db.runCommand({"mapreduce":"users","map":map,"reduce":reduce,"out":{inline:1}})

也可以使用如下命令方式:

db.users.mapReduce(map,reduce,{out:{inline:1}})

执行后返回结果如下:

{
	"results" : [
		{
			"_id" : "_id",
			"value" : {
				"count" : 3
			}
		},
		{
			"_id" : "age",
			"value" : {
				"count" : 1
			}
		},
		{
			"_id" : "email",
			"value" : {
				"count" : 1
			}
		},
		{
			"_id" : "emails",
			"value" : {
				"count" : 1
			}
		},
		{
			"_id" : "favorite book",
			"value" : {
				"count" : 1
			}
		},
		{
			"_id" : "hobby",
			"value" : {
				"count" : 1
			}
		},
		{
			"_id" : "name",
			"value" : {
				"count" : 3
			}
		},
		{
			"_id" : "score",
			"value" : {
				"count" : 2
			}
		}
	],
	"timeMillis" : 311,
	"counts" : {
		"input" : 3,
		"emit" : 13,
		"reduce" : 3,
		"output" : 8
	},
	"ok" : 1
}

 

官网文档地址:http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions  

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics