【问题标题】:MongoDB map/reduce, forEach is not a function?MongoDB map/reduce、forEach 不是函数?
【发布时间】:2012-08-01 10:55:06
【问题描述】:

我正在 MongoDB 中创建一个 Map 函数,一旦我在数组上使用 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});
        });
    }
}

当我在 mongo 中运行我的 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
}

我尝试了一些不同的方法,但似乎都不起作用,这可能是一个简单的问题,但我看不出我哪里做错了。

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

谢谢!

【问题讨论】:

  • 不确定 this.channels 是什么变量类型,但它表明它不是数组或对象。你是如何创建它的?
  • 我在 php 中使用 mongo 扩展创建它,它看起来像这样:array('channels' => $channels)$channels 看起来像这样:array('channel 1', 'channel 2')
  • 问题不在于 PHP,而在于 JavaScript。如果你这样做 typeof(variable) 它应该告诉你什么是 this.channel
  • 是的,它似乎是一个对象。顺便说一句,怎么会?我可以通过其他方式做到这一点吗?我可以将其转换为数组吗?

标签: javascript mongodb mapreduce


【解决方案1】:

通过使用 for 而不是 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});
        }   
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多