0

挿入のパフォーマンスのために、小さなドキュメントをバッチで保存したいというシナリオがあります。もちろん、個々のアイテムを検索できるようにしたいと思います。

public class Batch
{
    public Guid Id { get; set; }
    public Item[] Items { get; set; }
}

public class Item
{
    public int Id { get; set; }
    public string Description { get; set; }
}

説明で検索し、IDを返したいとします。私は次の非常に単純なmap/reduceインデックスを作成しましたが、これはまさにそれを実行することを期待しています。

Map = batches =>
    from batch in batches
    from item in batch.Items
    select new Result
        {
             Description = item.Description,
             ItemIds = new[] {item.Id}
        };

Reduce = results =>
    from result in results
    group result by result.Description into g
    select new Result
        {
             Description = g.Key,
             ItemIds = g.SelectMany(x => x.ItemIds).ToArray()
        };

このインデックスを使用したクエリは失敗せず、結果を返さないだけです。

インデックスが少し変更された場合、IDを取得するためにSelectManyの代わりにstring.Joinを使用すると、すべてが正常に機能します。

Map = batches =>
     from batch in batches
     from item in batch.Items
     select new Result
         {
             Description = item.Description,
             ItemIdsAsString = item.Id.ToString(),
         };

Reduce = results =>
     from result in results
     group result by result.Description into g
     select new Result
         {
             Description = g.Key,
             ItemIdsAsString = string.Join("|", g.Select(x => x.ItemIdsAsString)),
         };

動作は完全に同じですが、IDがこれらの整数の配列としてではなく、「2 | 5|7」として格納されるようになっている点が異なります。しかし今回は、インデックスは正しい結果を生成します。

完全なテストはここにあります

SelectManyがReduce式で機能しない理由はありますか?

4

0 に答える 0