如何在c#中使用MapReduce连接两个集合

本文关键字:集合 两个 连接 MapReduce | 更新日期: 2023-09-27 17:49:21

为了连接两个数据集,我尝试用以下方式将这个示例转换为c#:

如果你们中的任何人可以建议适当的代码修改,以达到与示例相同的结果,我将非常感谢。

如何在c#中使用MapReduce连接两个集合

产生与本例相同结果的解决方案如下:

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;
        }";
}