为了加入两个数据集,我尝试通过以下方式将此示例转换为 C#:
如果你们中的任何人可以建议适当的代码修改以实现与示例相同的结果,我将非常感激。
产生与此示例相同结果的解决方案如下:
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;
}";
}