When using GuidRepresentationMode.V3 you cannot filter on GUID in a project using the aggregation framework. The code throws it's expecting GuidRepresentationMode.V2.
Below you can find a simple example:
public class BrokenSerializers : IDisposable { public class GuidDocument { public Guid Id { get; set; } public string Name { get; set; } public IEnumerable<GuidInnerDocument> Documents { get; set; } } public class GuidInnerDocument { public Guid Id { get; set; } public Guid AnotherId { get; set; } } private IMongoClient _client; private IMongoDatabase _database; private IMongoCollection<GuidDocument> _collection; [Fact] public async Task GuidRepresentationModeV2ToV3() { BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3; BsonSerializer.RegisterSerializer(typeof(Guid), new GuidSerializer(GuidRepresentation.Standard)); BsonClassMap.RegisterClassMap<GuidDocument>(x => x.AutoMap()); BsonClassMap.RegisterClassMap<GuidInnerDocument>(x => x.AutoMap()); _client = new MongoClient("mongodb://localhost:27017/?replicaSet=rs1"); _database = _client.GetDatabase("SomeTestDb"); _collection = _database.GetCollection<GuidDocument>("SomeCollection"); var documentId = Guid.NewGuid(); var anotherDocumentId = Guid.NewGuid(); await _collection.InsertOneAsync(new GuidDocument { Id = documentId, Documents = new[] { new GuidInnerDocument {Id = Guid.NewGuid(), AnotherId = anotherDocumentId}, new GuidInnerDocument {Id = Guid.NewGuid(), AnotherId = Guid.NewGuid()}, new GuidInnerDocument { Id = Guid.NewGuid(), AnotherId = Guid.NewGuid() } } }); var documentQuery2 = await _collection .Aggregate() .Match(x => x.Documents.Any(y => y.AnotherId == anotherDocumentId)) .Project(x => new { DocumentId = x.Id, Document = x.Documents.First(y => y.AnotherId == anotherDocumentId) }) .SingleOrDefaultAsync(); Assert.Equal(documentId, documentQuery2.DocumentId); Assert.Equal(anotherDocumentId, documentQuery2.Document.AnotherId); } public void Dispose() { new MongoClient("mongodb://localhost:27017/?replicaSet=rs1").DropDatabase("SomeTestDb"); } } }
Below you can find the exception
System.InvalidOperationException This constructor can only be used when BsonDefaults.GuidRepresentationMode is V2. at MongoDB.Bson.BsonBinaryData..ctor(Guid guid) at MongoDB.Bson.BsonTypeMapper.Convert(Object value, Conversion conversion) at MongoDB.Bson.BsonTypeMapper.TryMapToBsonValue(Object value, BsonValue& bsonValue) at MongoDB.Bson.BsonTypeMapper.MapToBsonValue(Object value) at MongoDB.Bson.BsonValue.Create(Object value) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateConstant(Expression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateOperation(BinaryExpression node, String op, Boolean canBeFlattened) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateWhere(WhereExpression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TryTranslateFirstResultOperator(PipelineExpression node, BsonValue& result) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslatePipeline(PipelineExpression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateMapping(ProjectionMapping mapping) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateNew(NewExpression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node) at MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.Translate(Expression node, ExpressionTranslationOptions translationOptions) at MongoDB.Driver.Linq.Translators.AggregateProjectTranslator.TranslateProject(Expression expression, ExpressionTranslationOptions translationOptions) at MongoDB.Driver.Linq.Translators.AggregateProjectTranslator.Translate[TDocument,TResult](Expression`1 projector, IBsonSerializer`1 parameterSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions) at MongoDB.Driver.ProjectExpressionProjection`2.Render(IBsonSerializer`1 inputSerializer, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.PipelineStageDefinitionBuilder.<>c__DisplayClass32_0`2.<Project>b__0(IBsonSerializer`1 s, IBsonSerializerRegistry sr) at MongoDB.Driver.DelegatedPipelineStageDefinition`2.Render(IBsonSerializer`1 inputSerializer, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.AppendedStagePipelineDefinition`3.Render(IBsonSerializer`1 inputSerializer, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.AppendedStagePipelineDefinition`3.Render(IBsonSerializer`1 inputSerializer, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.MongoCollectionImpl`1.AggregateAsync[TResult](IClientSessionHandle session, PipelineDefinition`2 pipeline, AggregateOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.SingleOrDefaultAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken) at Intigriti.Mongo.IntegrationTests.BrokenSerializers.GuidRepresentationModeV2ToV3() in D:\code\library\Mongo\Intigriti.Mongo.IntegrationTests\BrokenSerializers.cs:line 116 at Xunit.Sdk.TestInvoker`1.<>c__DisplayClass48_1.<<InvokeTestMethodAsync>b__1>d.MoveNext() in C:\Dev\xunit\xunit\src\xunit.execution\Sdk\Frameworks\Runners\TestInvoker.cs:line 264 --- End of stack trace from previous location --- at Xunit.Sdk.ExecutionTimer.AggregateAsync(Func`1 asyncAction) in C:\Dev\xunit\xunit\src\xunit.execution\Sdk\Frameworks\ExecutionTimer.cs:line 48 at Xunit.Sdk.ExceptionAggregator.RunAsync(Func`1 code) in C:\Dev\xunit\xunit\src\xunit.core\Sdk\ExceptionAggregator.cs:line 90
Same exception is happing with version 2.13.0-beta of the driver
- is duplicated by
-
CSHARP-4024 System.InvalidOperationException: This constructor can only be used when BsonDefaults.GuidRepresentationMode is V2.
-
- Closed
-