4
votes

I'm having trouble getting a map reduce sample to work when the data is sharded across two nodes. I'm storing documents that relate to application errors being logged on two local ravenDB nodes, the error documents look like:

Example of document on node 1, there are 6 total

errors/1/6
{
  "UniqueId": "c62c7e30-8ec7-45af-88e4-da023d796727",
  "ApplicationName": "MyAppName"
}

Example of document on node 2, there are 7 total

errors/2/6  --Error stored on shard node 2
{
  "UniqueId": "7e0b0f87-9d75-4e70-9fa0-d64a18bc88dc",
  "ApplicationName": "MyAppName"
}

when I run this query:

public class ApplicationNames : AbstractIndexCreationTask<ErrorDocument, Application>
{
    public ApplicationNames()
    {
         Map = errors => from error in errors
                        select new { error.ApplicationName, Count = 1 };

        Reduce = results => from error in results
                            group error by new { error.ApplicationName, error.Count } into g
                            select new { g.Key.ApplicationName, Count = g.Sum(x=> x.Count) };
    }
}

I'm getting back 2 results; one with a Count of 6, the second with a Count of 7. I was expecting that the two results from each shard would be combined into one result with a count of 13. Not sure if I'm doing something wrong or if that's not how its supposed to work. I followed the example at http://ravendb.net/documentation/docs-sharding to set up the sharding strategy.

1

1 Answers

0
votes

Grant, RavenDB currently doesn't handle reduce over multiple nodes. You can do that yourself using:

session.Query<Application, ApplicationNames>()
   .ToList()
   .Select(new ApplicationNames().Reduce)
   .ToList();