Map reduce execute failed with pymongo but success in mongo shell
I got a problem about mongo map reduce, my map reduce can execute success in mongo shell but when i try to execute use pymongo i got the following errors.
The following json is my Collections JSON format sample
{ "_id" : ObjectId( "4e41661ecacbd10e00012600" ),
"timestamp" : "20110809",
"variants" : { "407" : { "number_of_ad_clicks" : 101,
"number_of_search_keywords" : 20,
"total_duration" : 4,
"os" : { "os_2" : 2,
"os_1" : 1,
"os_0" : 0 },
"countries" : { "ge" : 2,
"ca" : 7,
"fr" : 2,
"uk" : 5,
"us" : 2 },
"screen_resolutions" : { "(320, 240)" : 5,
"(640, 480)" : 7,
"(1024, 960)" : 9,
"(1280, 768)" : 6 },
"widgets" : { "widget_1" : 1,
"widget_0" : 0 },
"languages" : { "ua_uk" : 8,
"ca_en" : 6,
"ca_fr" : 8,
"us_en" : 1 },
"search_keywords" : { "search_keyword_15" : 15,
"search_keyword_14" : 14,
"search_keyword_17" : 17,
"search_keyword_16" : 16,
"search_keyword_11" : 11,
"search_keyword_10" : 10,
"search_keyword_13" : 13,
"search_keyword_12" : 12,
"search_keyword_19" : 19,
"search_keyword_18" : 18,
"search_keyword_9" : 9,
"search_keyword_8" : 8,
"search_keyword_5" : 5,
"search_keyword_4" : 4,
"search_keyword_7" : 7,
"search_keyword_6" : 6,
"search_keyword_1" : 1,
"search_keyword_3" : 3,
"search_keyword_2" : 2 },
"number_of_pageviews" : 38,
"browsers" : { "browser_4" : 4,
"browser_0" : 0,
"browser_1" : 1,
"browser_2" : 2,
"browser_3" : 3 },
"keywords" : { "keyword_5" : 5,
"keyword_4" : 4,
"keyword_1" : 1,
"keyword_0" : 0,
"keyword_3" : 3,
"keyword_2" : 2 },
"number_of_keyword_clicks" : 205,
"number_of_visits" : 91 },
"306" : { "number_of_ad_clicks" : 29,
"number_of_search_keywords" : 4,
"total_duration" : 4,
"os" : { "os_2" : 2,
"os_1" : 1,
"os_0" : 0 },
"countries" : { "ge" : 7,
"ca" : 7,
"fr" : 6,
"uk" : 1,
"us" : 3 },
"screen_resolutions" : { "(320, 240)" : 2,
"(640, 480)" : 1,
"(1024, 960)" : 9,
"(1280, 768)" : 5 },
"widgets" : { "widget_1" : 1,
"widget_0" : 0 },
"languages" : { "ua_uk" : 2,
"ca_en" : 8,
"ca_fr" : 5,
"us_en" : 4 },
"search_keywords" : { "search_keyword_1" : 1,
"search_keyword_3" : 3,
"search_keyword_2" : 2 },
"number_of_pageviews" : 35,
"browsers" : { "browser_4" : 4,
"browser_0" : 0,
"browser_1" : 1,
"browser_2" : 2,
"browser_3" : 3 },
"keywords" : { "keyword_5" : 5,
"keyword_4" : 4,
"keyword_1" : 1,
"keyword_0" : 0,
"keyword_3" : 3,
"keyword_2" : 2 },
"number_of_keyword_clicks" : 18,
"number_of_visits" : 57 },
"408" : { "number_of_ad_clicks" : 180,
"number_of_search_keywords" : 41,
"total_duration" : 7,
"os" : { "os_2" : 2,
"os_1" : 1,
"os_0" : 0 },
"countries" : { "ge" : 3,
"ca" : 6,
"fr" : 3,
"uk" : 9,
"us" : 9 },
"screen_resolutions" : { "(320, 240)" : 9,
"(640, 480)" : 9,
"(1024, 960)" : 5,
"(1280, 768)" : 10 },
"widgets" : { "widget_1" : 1,
"widget_0" : 0 },
"languages" : { "ua_uk" : 3,
"ca_en" : 2,
"ca_fr" : 10,
"us_en" : 7 },
"search_keywords" : { "search_keyword_37" : 37,
"search_keyword_36" : 36,
"search_keyword_28" : 28,
"search_keyword_29" : 29,
"search_keyword_24" : 24,
"sea开发者_Python百科rch_keyword_25" : 25,
"search_keyword_26" : 26,
"search_keyword_27" : 27,
"search_keyword_20" : 20,
"search_keyword_21" : 21,
"search_keyword_22" : 22,
"search_keyword_23" : 23,
"search_keyword_39" : 39,
"search_keyword_38" : 38,
"search_keyword_40" : 40,
"search_keyword_15" : 15,
"search_keyword_14" : 14,
"search_keyword_17" : 17,
"search_keyword_16" : 16,
"search_keyword_11" : 11,
"search_keyword_10" : 10,
"search_keyword_13" : 13,
"search_keyword_12" : 12,
"search_keyword_33" : 33,
"search_keyword_32" : 32,
"search_keyword_31" : 31,
"search_keyword_30" : 30,
"search_keyword_19" : 19,
"search_keyword_18" : 18,
"search_keyword_35" : 35,
"search_keyword_34" : 34,
"search_keyword_9" : 9,
"search_keyword_8" : 8,
"search_keyword_5" : 5,
"search_keyword_4" : 4,
"search_keyword_7" : 7,
"search_keyword_6" : 6,
"search_keyword_1" : 1,
"search_keyword_3" : 3,
"search_keyword_2" : 2 },
"number_of_pageviews" : 25,
"browsers" : { "browser_4" : 4,
"browser_0" : 0,
"browser_1" : 1,
"browser_2" : 2,
"browser_3" : 3 },
"keywords" : { "keyword_5" : 5,
"keyword_4" : 4,
"keyword_1" : 1,
"keyword_0" : 0,
"keyword_3" : 3,
"keyword_2" : 2 },
"number_of_keyword_clicks" : 15,
"number_of_visits" : 19 } },
"site_name" : "radiotiempo.com",
"number_of_variants" : 3 }
Here is my map reduce.
map = function(){
emit(1, {variants:this.variants});
}
reduce = function(key, vals) {
var returnValue = {
clicks: 0,
};
for(var j = 0 ; j < vals.length; j++){
for(var i = 0 ; i < variant_ids.length; i++){
try{
returnValue.clicks += vals[j].variants[variant_ids[i]].number_of_ad_clicks;
}catch(err)
{}
}
}
return returnValue;
}
function emit(k, v) {
print("emit");
print(" k:" + k + " v:" + tojson(v));
}
res = db.variant_daily_collection.mapReduce(map, reduce, {"scope": {'variant_ids': ['4519','4518']}, "out" : "myoutput", "query":{"site_name": {'$in':['julie2.com','julie3.com']}, 'timestamp': {'$gte':'20110601','$lte':'20110603'}}})
db.myoutput.find()
The following codes is my python codes using pymongo lib.
map = Code("function () {"
" emit(1, {variants:this.variants});"
"}")
reduce = Code("function (key, values) {"
" var result = {"
" clicks: 0"
" };"
" for (var i = 0; i < values.length; i++) {"
" for(var j = 0 ; j < variant_ids.length; j++){"
" result.clicks += values[i].variants[variant_ids[j]].number_of_ad_clicks;"
" }"
" }"
" return result;"
"}")
Following is error return from pymongo
In [103]: reduce = Code("function (key, valudb.variant_daily_collection.map_reduce(map, reduce, out = 'output',full_response = True, fields = {"scope": {'variant_ids': ['398']}, "query":{"site_name": 'routeplanner.net', 'timestamp': '20110809'}} ) .....: ---------------------------------------------------------------------------OperationFailure Traceback (most recent call last)/workspace/construction/<ipython console> in <module>()/workspace/construction/.ve/lib/python2.7/site-packages/pymongo-2.0-py2.7-macosx-10.7-intel.egg/pymongo/collection.py in map_reduce(self, map, reduce, out, merge_output, reduce_output, full_response, **kwargs)
1031 response = self.__database.command("mapreduce", self.__name,
1032 map=map, reduce=reduce,
-> 1033 out=out_conf, **kwargs)
1034
1035 if full_response or not response.get('result'):
/workspace/construction/.ve/lib/python2.7/site-packages/pymongo-2.0-py2.7-macosx-10.7-intel.egg/pymongo/database.py in command(self, command, value, check, allowable_errors, **kwargs)
338 msg = "command %r failed: %%s" % command
339 helpers._check_command_response(result, self.connection.disconnect,
--> 340 msg, allowable_errors)
341
342 return result
/workspace/construction/.ve/lib/python2.7/site-packages/pymongo-2.0-py2.7-macosx-10.7-intel.egg/pymongo/helpers.py in _check_command_response(response, reset, msg, allowable_errors)
123 ex_msg += (", assertionCode: %d" %
124 (response["assertionCode"],))
--> 125 raise OperationFailure(ex_msg, response.get("assertionCode"))
126 raise OperationFailure(msg % response["errmsg"])
127
OperationFailure: db assertion failure, assertion: 'invoke failed: JS Error: TypeError: values[i].variants[variant_ids[j]] has no properties nofile_b:0', assertionCode: 9004
In [104]:
The problem is you are passing 'scope' as 'fields'.
This works:
db.variant_daily_collection.map_reduce(m, r, out="myoutput", query={"site_name": {'$in':['julie2.com','julie3.com','radiotiempo.com']}, 'timestamp': {'$gte':'20110601','$lte':'20110809'}}, scope={'variant_ids': ['4519','4518']})
Where m is your map function from above and r is your reduce function above. I just inserted your example document three times to test.
I see a number of potential problems here, aside from what I noted in the comment above:
- You're overriding
emitin your shell example, which means your reduce function won't actually get run (if nothing is emitted, there's nothing to reduce) - You're
emitting a different format than yourreducefunction returns.reduceneeds to return values in the same format as the second argument toemit, sincereducemay be called multiple times on values including its own results (see the Map-Reduce docs) - You're always
emitting with the key1, which might be a problem depending on how you intend this to work - As noted above, your code appears to differ at least in the loop variables you use; I haven't compared it line by line to tell if there are any other differences, but your best bet is to directly copy your javascript function definition into a
Codein pymongo
Also, it would help if you could show your invocation of map_reduce as well as the map and reduce functions.
加载中,请稍侯......
精彩评论