Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-3691

GuidRepresentationMode.V3 filter in project of aggregation throws InvalidOperationException

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Unknown Unknown
    • 2.14.0
    • Affects Version/s: 2.12.3
    • Component/s: LINQ3
    • None
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      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

            Assignee:
            Unassigned Unassigned
            Reporter:
            arne@intigriti.be Arne Schoonvliet
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: