次の RavenDB インデックスがあります。
public class MyDomain_WeeklyPerYear : AbstractIndexCreationTask<Entities.MyDomain, MyDomain_YearlyTotals.Result>
{
public class Result
{
public int ProcessWeek { get; set; }
public int ProcessYear { get; set; }
public int Total { get; set; }
public object Weeks { get; set; }
public string Workspace { get; set; }
}
public MyDomain_WeeklyPerYear()
{
Map = data => data
.Select(x => new
{
x.ProcessWeek,
x.ProcessYear,
x.Workspace,
Total = 1,
Weeks = (List<object>) null
});
Reduce = results => results
.GroupBy(x => x.ProcessYear)
.OrderBy(x => x.Key)
.Select(x => new
{
ProcessWeek = 0,
ProcessYear = x.Key,
Workspace = (string) null,
Total = 0,
Weeks = x
.GroupBy(y => y.ProcessWeek)
.OrderBy(y => y.Key)
.Select(y => new
{
Week = y.Key,
Total = y.Sum(z => z.Total)
})
.ToList()
});
}
}
以下のクエリで実行すると、次の結果が得られます。
var data = await Session
.Query<MyDomain_WeeklyPerYear.Result, MyDomain_WeeklyPerYear>()
.ToListAsync();
[
{
"processWeek": 0,
"processYear": 2012,
"total": 0,
"weeks": [
{
"Week": 1,
"Total": 8
},
{
"Week": 49,
"Total": 4
},
{
"Week": 50,
"Total": 6
},
{
"Week": 51,
"Total": 11
},
{
"Week": 52,
"Total": 4
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2013,
"total": 0,
"weeks": [
{
"Week": 0,
"Total": 0
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2014,
"total": 0,
"weeks": [
{
"Week": 0,
"Total": 0
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2015,
"total": 0,
"weeks": [
{
"Week": 0,
"Total": 0
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2016,
"total": 0,
"weeks": [
{
"Week": 0,
"Total": 0
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2017,
"total": 0,
"weeks": [
{
"Week": 0,
"Total": 0
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2018,
"total": 0,
"weeks": [
{
"Week": 0,
"Total": 0
}
],
"workspace": null
},
{
"processWeek": 0,
"processYear": 2019,
"total": 0,
"weeks": [
{
"Week": 2,
"Total": 14
},
{
"Week": 3,
"Total": 30
},
{
"Week": 4,
"Total": 42
},
{
"Week": 5,
"Total": 52
},
{
"Week": 6,
"Total": 51
},
{
"Week": 7,
"Total": 39
},
{
"Week": 8,
"Total": 53
},
{
"Week": 9,
"Total": 47
},
{
"Week": 10,
"Total": 52
}
],
"workspace": null
}
]
データの構造は正しい JSON 構造ですが、多くのデータが欠落しているようです。2012 年と 2019 年に結果が得られます (どちらも正しい)。しかし、2012 年と 2019 年よりも多くのデータが格納されていると 100% 確信しているにもかかわらず、他の年は空です。
reduce を次のように変更すると (2 番目の を削除.Select()
):
Reduce = results => results
.GroupBy(x => x.ProcessYear)
.OrderBy(x => x.Key)
.Select(x => new
{
ProcessWeek = 0,
ProcessYear = x.Key,
Workspace = (string) null,
Total = 0,
Weeks = x
.GroupBy(y => y.ProcessWeek)
.OrderBy(y => y.Key)
.ToList()
});
その結果、このような奇妙な構造が得られます (完全な JSON は非常に長いため、2013 年の小さなグラブについては、blow を参照してください)。
[
{
... other years
},
{
"processWeek": 0,
"processYear": 2013,
"total": 0,
"weeks": [
{
"ProcessWeek": 0,
"ProcessYear": 2013,
"Workspace": null,
"Total": 0,
"Weeks": [
[
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 7,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
}
],
[
{
"ProcessWeek": 12,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 12,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
{
"ProcessWeek": 12,
"ProcessYear": 2013,
"Workspace": "my-workspace",
"Total": 1,
"Weeks": null
},
]
]
}
]
},
{
... other years
}
]
ご覧のとおり、2013 にはデータがありますが、最初の JSON 結果には表示されていませんが、予期していなかった奇妙な構造になっています。1 回目の reduce で 2013 年のデータが表示されないのは、おそらくそのためだと思います。
私の質問:
- 最初の削減で、正しいデータ (2012 年と 2019 年) を含む正しい構造が得られるのに、他の年が欠落しているのはなぜですか?
- 2番目のreduceで、他の年にデータがあることを示す奇妙なJSON構造が表示されるのはなぜですか?
- 最初の JSON の例から構造内のすべてのデータを取得するにはどうすればよいですか?
私はかなり長い間この問題に悩まされてきました。助けていただければ幸いです。
RavenDB Client: 4.1.4
RavenDB Server: 4.1.3