2016-08-12 11 views
0
public class LedgerItem 
{ 
    public string Id { get; set; } 
    ... 
} 

public class Order 
{ 
    ... 
    public IList<OrderLine> OrderLines { get; private set; } 
    ... 
} 

public class OrderLine 
{ 
    ... 
    public List<string> LedgerItemIds { get; set; } 
    ... 
} 

任意のOrder.OrderLines.LedgerItemIdsでIdで参照されていないすべてのLedgerItemを見つける必要があります。関連ドキュメントで参照されていないRavenDBクエリドキュメント

これまで、LedgerItemsとOrdersからLedgerItemsをすべて選択してからLedgerItemIdでグループ化し、Countを合計するためにMulti-Map/Reduceインデックスを作成しようとしました。 私の計画はCount == 1でクエリすることでした。これは、それがグループに一度しか存在しないことを意味します。

public class LedgerItemResult 
{ 
    public string Id { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public string ProTeriaCustomerId { get; set; } 
    public string Collection { get; set; } 
    public int Count { get; set; } 
} 

public class LedgerItemsFromLedgerItemsAndOrdersGroupById : AbstractMultiMapIndexCreationTask<LedgerItemResult> 
{ 
    public LedgerItemsFromLedgerItemsAndOrdersGroupById() 
    { 
     AddMap<LedgerItem>(
      ledgeritems => from ledgeritem in ledgeritems 
      where (decimal)ledgeritem.Amount < 0m 
      select new 
      { 
       Id = ledgeritem.Id, 
       CreatedDate = ledgeritem.TimeStamp, 
       ProTeriaCustomerId = ledgeritem.ProTeriaCustomerId, 
       Collection = MetadataFor(ledgeritem)["Raven-Entity-Name"].ToString(), 
       Count = 1 
      } 
     ); 

     AddMap<Order>(
      orders => from order in orders 
      from orderline in order.OrderLines 
      from ledgeritemid in orderline.LedgerItemIds 
      select new 
      { 
       Id = ledgeritemid, 
       CreatedDate = order.CreatedDateTime, 
       ProTeriaCustomerId = order.ProTeriaCustomerId, 
       Collection = MetadataFor(order)["Raven-Entity-Name"].ToString(), 
       Count = 1 
      } 
     ); 

     Reduce = results => 
      from result in results 
      group result by result.Id into g 
      select new LedgerItemResult 
      { 
       Id = g.First().Id, 
       CreatedDate = g.First().CreatedDate, 
       ProTeriaCustomerId = g.First().ProTeriaCustomerId, 
       Collection = g.First().Collection, 
       Count = g.Sum(x => x.Count) 
      }; 

     Stores.Add(x => x.Id, FieldStorage.Yes); 
     Stores.Add(x => x.CreatedDate, FieldStorage.Yes); 
     Stores.Add(x => x.ProTeriaCustomerId, FieldStorage.Yes); 
     Stores.Add(x => x.Collection, FieldStorage.Yes); 

     MaxIndexOutputsPerDocument = 250; 
    } 
} 

これは正しく動作していないようです。私はCount == 1とCount == 2でクエリを試してみましたが、Count == 1のためにあまりにも多くの結果が得られました.LedgerItemIdsの1つを手動でチェックして、実際にOrderによって参照されたかどうかを確認しました。すべきではない。

おそらくこれを達成するための方がはるかに簡単ですが、私はまだSQLの考え方に多少慣れています。

これを達成するための方法を見つけて、Management StudioのLucene構文とLiINQのコードを使ってインデックスをクエリできます。

答えて

0

私は正しい軌道に乗っていましたが、ディスクがいっぱいになったためしばらく時間を過ごしました。インデックス作成が実行されていて作成されたインデックスが矛盾していたときに、「ディスクスペースが小さすぎるとインデックスを停止する」しきい値を超えた可能性があります。

関連する問題