2013-11-02 3 views
1

Я пробовал много разных стратегий для индексации моих данных, но, похоже, не могу понять это сам.Индексирование пожеланий и торговых списков в RavenDB

Я строю базу данных по пользователям и их играм. Пользователи могут поставить базу данных игр, которыми они владеют, и хотели бы торговать, а также список игр, они хотели бы иметь:

public class Member : EntityBase 
{ 
    public List<Game> TradeList { get; set; } 
    public List<Game> WishList { get; set; } 
} 

Я пытаюсь создать и индекс можно запросить в форме «Дайте мне список всех игр (с соответствующими членами), которые имеют игры в своем TradeList, соответствующие моему WishList, а также игры в WishList, соответствующие моему TradeList» .. и, конечно, я сам исключен.

Я попытался создать MultiMapIndex:

public class TradingIndex : AbstractMultiMapIndexCreationTask<TradingIndex.Result> 
{ 
    public enum ListType 
    { 
     Wishlist, 
     Tradelist 
    } 

    public class Result 
    { 
     public string Game { get; set; } 
     public string Member { get; set; } 
     public ListType List { get; set; } 
    } 

    public TradingIndex() 
    { 
     AddMap<Member>(members => from member in members 
      from game in member.TradeList 
      select new Result() 
      { 
       Game = game.Id, 
       Member = member.Id, 
       List = ListType.Tradelist 
      }); 

     AddMap<Member>(members => from member in members 
      from game in member.WishList 
      select new Result() 
      { 
       Game = game.Id, 
       Member = member.Id, 
       List = ListType.Wishlist 
      }); 
    } 
} 

А потом запрашивая его так:

db.Query<TradingIndex.Result, TradingIndex>() 
    .Where(g => 
     (g.Game.In(gamesIWant) && g.List == TradingIndex.ListType.Tradelist) 
     && 
     (g.Game.In(gamesITrade) && g.List == TradingIndex.ListType.Wishlist) 
     && 
     g.Member != me.Id 
) 

Но я не могу получить, чтобы работать. Я также посмотрел на Map/Reduce, но проблема, с которой я, похоже, получаю RavenDB, чтобы дать мне правильный тип результата.

Надеюсь, вы получите то, что я пытаюсь сделать, и могу дать мне несколько советов о том, что посмотреть.

ответ

1

Во-первых, вам нужно убедиться, что вы сохраняете поля, которые вы индексируете. Это необходимо, так что вы можете получить результаты назад, а не документов, которые соответствуют индексу.

Добавьте это к нижней части определения индекса:

StoreAllFields(FieldStorage.Yes); 

Или, если вы хотите быть более многословным, (возможно, ваш индекс делает другие вещи также):

Store(x => x.Game, FieldStorage.Yes); 
Store(x => x.Member, FieldStorage.Yes); 
Store(x => x.List, FieldStorage.Yes); 

Когда ты запросите это, вам нужно будет сообщить Ворону, чтобы отправить вам записи индекса, используя ProjectFromIndexFieldsIntoas described here.

Далее вам нужно понять, что вы не создаете ни одной записи индекса, которая будет соответствовать вашему запросу. Индекс мультимары создает отдельно записей в индексе для каждой карты. Если вы хотите объединить их в своих результатах, вам необходимо использовать intersection query.

Сведя вместе, ваш запрос должен выглядеть следующим образом:

var q = session.Query<TradingIndex.Result, TradingIndex>() 
       .Where(g => g.Game.In(gamesIWant) && 
          g.List == TradingIndex.ListType.Tradelist && 
          g.Member != me.Id) 
       .Intersect() 
       .Where(g => g.Game.In(gamesITrade) && 
          g.List == TradingIndex.ListType.Wishlist && 
          g.Member != me.Id) 
       .ProjectFromIndexFieldsInto<TradingIndex.Result>(); 

Full test in this GIST.

+0

По какой-то причине ваш код не работал с моими данными. Однако после сброса всех данных и индексов и их воссоздания он действительно работал. Странный. Разве RavenDB не должен перестраивать индекс при обнаружении изменений? – hakksor

+0

Возможно, вы могли бы просто * сбросить * индекс, вместо того, чтобы сбросить все ваши данные. Но я рассмотрю это дальше. Интересно, рассматривает ли Raven изменения в настройках «FieldStorage» при определении необходимости восстановления индекса. –

+0

Проделайте пару тестов, и кажется, что изменения в хранилище полей восстанавливают индекс. См. [Этот GIST] (https://gist.github.com/mj1856/7311049). Возможно, индекс был только что восстановлен, когда вы проверили первый раз? –

Смежные вопросы