using System; using System.Linq; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; using MongoDB.Driver; using NUnit.Framework; namespace TPP.Persistence.MongoDB.Tests.Repos { public enum TestEnum { Foo, Bar, Baz } public record TestEntity(string Id, string Category, TestEnum EnumValue); public class TestEnumSerializer : SerializerBase { public override TestEnum Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { return context.Reader.ReadString() switch { "my_foo" => TestEnum.Foo, "my_bar" => TestEnum.Bar, "my_baz" => TestEnum.Baz, _ => throw new ArgumentOutOfRangeException() }; } public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TestEnum value) { context.Writer.WriteString(value switch { TestEnum.Foo => "my_foo", TestEnum.Bar => "my_bar", TestEnum.Baz => "my_baz", _ => throw new ArgumentOutOfRangeException() }); } } public class MongoEnumTest { [Test] public void Foo() { BsonClassMap.RegisterClassMap(cm => { cm.MapIdProperty(e => e.Id); cm.MapProperty(e => e.Category) .SetElementName("category"); cm.MapProperty(e => e.EnumValue) .SetElementName("enum_value") .SetSerializer(new TestEnumSerializer()); }); IMongoClient client = new MongoClient(); IMongoDatabase db = client.GetDatabase("test_database"); db.CreateCollection("test_collection"); IMongoCollection collection = db.GetCollection("test_collection"); collection.InsertOne(new TestEntity("1", "cat1", TestEnum.Foo)); collection.InsertOne(new TestEntity("2", "cat1", TestEnum.Bar)); collection.InsertOne(new TestEntity("3", "cat2", TestEnum.Bar)); var bars = collection.Aggregate() .Group( e => e.Category, group => new { NumBars = group.Count(e2 => e2.EnumValue == TestEnum.Bar) }) .ToList(); Assert.AreEqual(2, bars.Count); foreach (var wrapperObject in bars) Assert.AreEqual(1, wrapperObject.NumBars); } } }