2013-08-17 112 views
2

我有记录的集合,如下所示:蒙戈DB MapReduce的混乱

{ "_id" : "279771168740729_100208116788436_242", "user_likes" : false, "message" : "nice work,nice bank", "like_count" : 4, "page_username" : "icicibank", "page_id" : "279771168740729", "can_remove" : false, "from" : { "id" : "100003762913358", "name" : "Ramakant Mirewad" }, "page_name" : "ICICI Bank", "post_id" : "279771168740729_100208116788436", "created_time" : "2012-06-06T15:40:33+0000" } 
{ "_id" : "279771168740729_100208116788436_250", "user_likes" : false, "message" : "Best bank of india", "like_count" : 4, "page_username" : "icicibank", "page_id" : "279771168740729", "can_remove" : false, "from" : { "id" : "100003520362950", "name" : "Santosh Pandey" }, "page_name" : "ICICI Bank", "post_id" : "279771168740729_100208116788436", "created_time" : "2012-06-06T15:48:45+0000" } 

我的目标是计算一个消息关键字“最佳”的发生。在这里,消息可以只包含“最好”或可以包含具有“最佳”的句子。因此,我写了下面:

var mapFunction = function() { 

    var keyword = "Best"; 
    var messageStr = this.message; 

    if(messageStr.indexOf(keyword) != -1){ 
    emit(keyword, 1); 
    } 

}; 

var reduceFuntion = function(keyword, keywordCountCollection) { 

    return Array.sum(keywordCountCollection); 
}; 


db.icici_facebook.mapReduce(mapFunction,reduceFuntion,{out : "icici_fb_keyword_count", verbose : true}) 

我得到了一个错误:

Sat Aug 17 12:10:25.362 JavaScript execution failed: map reduce failed:{ 
     "errmsg" : "exception: JavaScript execution failed: TypeError: Cannot ca 
ll method 'indexOf' of undefined near 'essageStr.indexOf(keyword) != -1)' (line 
6)", 
     "code" : 16722, 
     "ok" : 0 
} at src/mongo/shell/collection.js:L970 

我试图匹配()等太多,但我想我失去了一些东西,因为它的JS功能都没有得到承认 - 我应该如何继续?

回答

2

你的问题是纯粹的Java脚本代码,或事实上你不检查,如果你的文档包含一个消息字段:

if(messageStr.indexOf(keyword) != -1){ 
    emit(keyword, 1); 
} 

应该

if(messageStr != null && messageStr.indexOf(keyword) != -1){ 
    emit(keyword, 1); 
} 

无论如何,你的目标是更简单的查询:

db.icici_facebook.count({message : /best/i})

+0

它的工作,但只是为了确认 - 是错误的,因为在某些文档中,消息不存在?或者是其他东西?我仍然不清楚我犯了什么js错误 –

+1

是的,错误是由于你的一些文档缺少消息字段,你不能在null/undefined处调用indexOf –