问题
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,
"search_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]:
回答1:
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.
回答2:
I see a number of potential problems here, aside from what I noted in the comment above:
- You're overriding
emit
in your shell example, which means your reduce function won't actually get run (if nothing is emitted, there's nothing to reduce) - You're
emit
ting a different format than yourreduce
function returns.reduce
needs to return values in the same format as the second argument toemit
, sincereduce
may be called multiple times on values including its own results (see the Map-Reduce docs) - You're always
emit
ting 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
Code
in pymongo
Also, it would help if you could show your invocation of map_reduce
as well as the map
and reduce
functions.
来源:https://stackoverflow.com/questions/7012236/map-reduce-execute-failed-with-pymongo-but-success-in-mongo-shell