Description
Summary
Generated projection stage does not use registered class maps.
How to Reproduce
BsonClassMap.RegisterClassMap(new ItemClassMap()); |
BsonClassMap.RegisterClassMap(new SubItemClassMap()); |
BsonClassMap.RegisterClassMap(new AggregationClassMap());var pipeline = PipelineDefinitionBuilder.For<Item>() |
.Group(
|
e => e.Date,
|
grouping => new Aggregation |
{
|
Date = grouping.Key, Count = grouping.Sum(item => item.Items.Length)
|
});var renderedPipeline = pipeline.Render(BsonSerializer.LookupSerializer<Item>(), BsonSerializer.SerializerRegistry, LinqProvider.V3).Documents;foreach (var doc in renderedPipeline) Console.WriteLine(doc.ToString()); |
|
|
public class SubItem |
{
|
public string Name { get; set; } |
}
|
|
|
public class Item |
{
|
public string Id { get; set; } |
public DateTime Date { get; set; } |
public SubItem[] Items { get; set; } |
}
|
|
|
public class Aggregation |
{
|
public DateTime Date { get; set; } |
public long Count { get; set; } |
}
|
|
|
public class SubItemClassMap : BsonClassMap<SubItem> |
{
|
public SubItemClassMap() |
{
|
MapMember(e => e.Name).SetElementName("name"); |
}
|
}
|
|
|
public class ItemClassMap : BsonClassMap<Item> |
{
|
public ItemClassMap() |
{
|
MapIdField(e => e.Id).SetIdGenerator(StringObjectIdGenerator.Instance);
|
MapMember(e => e.Date).SetElementName("date"); |
MapMember(e => e.Items).SetElementName("items"); |
}
|
}
|
|
|
public class AggregationClassMap : BsonClassMap<Aggregation> |
{
|
public AggregationClassMap() |
{
|
MapMember(e => e.Date).SetElementName("date"); |
MapMember(e => e.Count).SetElementName("count"); |
}
|
}
|
The generated documents looks following:
[
|
{ "$group" : {
|
"_id" : "$date",
|
"__agg0" : { "$sum" : { "$size" : "$items" } }
|
}}
|
{ "$project" : {
|
"Date" : "$_id",
|
"Count" : { "$toLong" : "$__agg0" },
|
"_id" : 0
|
}}
|
]
|
I've expected the following
[
|
{ "$group" : {
|
"_id" : "$date",
|
"__agg0" : { "$sum" : { "$size" : "$items" } }
|
}}
|
{ "$project" : {
|
"date" : "$_id",
|
"count" : { "$toLong" : "$__agg0" },
|
"_id" : 0
|
}}
|
]
|
The 2.18.0 driver generates a $convert step instead of the $toLong. Using $toLong seems to be correct for 2.19.0
Attachments
Issue Links
- related to
-
CSHARP-4819 ReplaceWith not respecting custom element name configured by the serializer
-
- Investigating
-