Description
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
Attachments
Issue Links
- is duplicated by
-
CSHARP-4024 System.InvalidOperationException: This constructor can only be used when BsonDefaults.GuidRepresentationMode is V2.
-
- Closed
-