Summary
Generated projection stage does not use registered class maps.
How to Reproduce
Unable to find source-code formatter for language: csharp. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
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
- related to
-
CSHARP-4819 ReplaceWith not respecting custom element name configured by the serializer
- Blocked