2012-08-01 72 views
1

我在MongoDB中创建一个Map函数,当我在数组上使用forEach()时就会出现问题。MongoDB map/reduce,forEach不是函数吗?

这是一个用户可能看怎么样:

"channels" : [ 
    "Channel 1", 
    "Channel 2", 
], 
"user_id" : "somehash" 

这是导致错误我的地图功能:

var map = function() { 
    if(this.channels && this.user_id) { 

     var user_id = this.user_id; 

     this.channels.forEach(function(z, user_id) { 
      emit(z, {user: user_id}); 
     }); 
    } 
} 

当我跑我的Map/Reduce在蒙戈我用的是以下命令,我也得到以下错误:

> db.users.mapReduce(map, reduce, {out : "myoutput" }); 
Wed Aug 1 12:48:11 uncaught exception: map reduce failed:{ 
    "assertion" : "map invoke failed: JS Error: TypeError: this.channels.forEach is not a function nofile_b:3", 
    "assertionCode" : 9014, 
    "errmsg" : "db assertion failure", 
    "ok" : 0 
} 

我试过一些不同的方法和n一个似乎工作,这可能是一个简单的问题,但我不明白我在哪里做错了。

很高兴在这个问题上得到一些帮助。

谢谢!

+0

不确定变量的类型是什么* this.channels *,但它接缝它不是一个数组或对象。 你是如何创建它? – 2012-08-01 11:21:03

+0

http://stackoverflow.com/a/5572089/752568 – thinklinux 2012-08-01 11:22:29

+0

这是一个数组! :) – Ms01 2012-08-01 11:23:40

回答

1

使用,而不是的forEach,因为它仍然是我能使用就可以了.length矢量修正它。

解决方案:

var map = function() { 
    if(this.channels && this.user_id) { 
     var user_id = this.user_id; 
     for(var i = 0, imax = this.channels.length; i<imax; i++) { 
      emit(this.channels[i], {user: user_id}); 
     } 
    } 
}