2

In order to join two datasets I tried to translate this example to C# the following way:

I would be very thankful if anyone of you could suggest the appropriate code modification in order to achieve the same result as the example.

Niko Gamulin
  • 66,025
  • 95
  • 221
  • 286

1 Answers1

3

The solution which produces the same results as this example is the following:

class Program
{
    static void Main(string[] args)
    {
        var connectionString = "mongodb://localhost";
        var client = new MongoClient(connectionString);
        var server = client.GetServer();
        var database = server.GetDatabase("mr_demo");
        var cLifeExpectancy = database.GetCollection("life_expectancy");
        var cEconomicAssistance = database.GetCollection("us_economic_assistance");

        var options = new MapReduceOptionsBuilder();
        options.SetOutput(MapReduceOutput.Inline);


        options.SetOutput(MapReduceOutput.Reduce("result"));
        var result = cLifeExpectancy.MapReduce(life_expect_map, r, options);
        result = cEconomicAssistance.MapReduce(us_econ_map, r, options);

        foreach (var record in result.GetResults())
        {
            Console.WriteLine(record);
        }
    }

    private static string life_expect_map =
        @"function() {
            // Simply emit the age and 0 for the dollar amount.
            // The dollar amount will come from the other collection.
            emit(this.country, {life_expectancy: this.age, dollars: 0});
        }";

    private static string us_econ_map =
        @"function() {
            // The data set contains grant amounts going back to 1946.  I
            // am only interested in 2009 grants.
            if (this.FY2009 !== undefined && this.FY2009 !== null) {
                emit(this.country_name, {
                    dollars: this.FY2009,
                    life_expectancy: 0
                });
            }
        }";

    private static string r =
        @"function(key, values) {
            var result = {dollars: 0, life_expectancy: 0};

            values.forEach(function(value) {
                // Sum up all the money from all the 2009 grants for this
                // country (key)
                result.dollars += (value.dollars !== null) ? value.dollars : 0;
                // Only set life expectancy once
                if (result.life_expectancy === 0 &&
                value.life_expectancy !== null
                ) {
                    result.life_expectancy = value.life_expectancy;
                }
            });

            return result;
        }";
}
Danny Varod
  • 17,324
  • 5
  • 69
  • 111
Niko Gamulin
  • 66,025
  • 95
  • 221
  • 286