问题
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 
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.
来源:https://stackoverflow.com/questions/7012236/map-reduce-execute-failed-with-pymongo-but-success-in-mongo-shell