Работает ли Multi Map / Reduce в RavenDb? - PullRequest
4 голосов
/ 23 декабря 2011

Я прочитал пост в блоге Айенде о функции мультикарты RavenDB и пытался реализовать его. Я не могу заставить его работать. То, что у меня есть, в основном совпадает с примером в сообщении в блоге:

class RootDocument {
    public string Id { get; set; }

    public string Foo { get; set; }
    public string Bar { get; set; }
}

public class ChildDocument {
    public string Id { get; set; }

    public string RootId { get; set; }
    public int Value { get; set; }
}

class RootsByIdIndex: AbstractMultiMapIndexCreationTask<RootsByIdIndex.Result> {
    public class Result {
        public string Id { get; set; }
        public string Foo { get; set; }
        public string Bar { get; set; }
        public int Value { get; set; }
    }

    public RootsByIdIndex() {
        AddMap<ChildDocument>(children => from child in children
                                          select new {
                                              Id = child.RootId,
                                              Foo = (string)null,
                                              Bar = (string)null,
                                              Value = child.Value
                                          });
        AddMap<RootDocument>(roots => from root in roots
                                      select new {
                                          Id = root.Id,
                                          Foo = root.Foo,
                                          Bar = root.Bar,
                                          Value = 0
                                      });
        Reduce = results => from result in results
                            group result by result.Id into g
                            select new {
                                Id = g.Key,
                                Foo = g.Select(x => x.Foo).Where(x => x != null).First(),
                                Bar = g.Select(x => x.Bar).Where(x => x != null).First(),
                                Value = g.Sum(x => x.Value)
                            };
    }
}

Запросы по индексу всегда дают мне значение 0 для атрибута Value. Небольшое изменение индекса приводит к тому, что карта ChildDocument никогда не получает никаких документов.

Должно ли это работать в текущей стабильной сборке RavenDB (1.0.573)? Или я делаю это неправильно?

1 Ответ

4 голосов
/ 23 декабря 2011

Редукционная часть вашего индекса неверна в полях Foo и Bar.

В первой функции Map вы устанавливаете Foo и Boo в null, поскольку структура для вывода всех функций Map должнабыть точно таким же в MultiMap Index.Вы должны использовать FirstOrDefault() вместо First()

Foo = g.Select(x => x.Foo).Where(x => x != null).FirstOrDefault(),
Bar = g.Select(x => x.Bar).Where(x => x != null).FirstOrDefault(),
...