[CSHARP-2908]  System.FormatException. If result of $divide it is not integer value exception be thrown when Aggregate.Project are using Created: 22/Jan/20  Updated: 27/Oct/23  Resolved: 05/Feb/20

Status: Closed
Project: C# Driver
Component/s: Command Operations
Affects Version/s: 2.10.1
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Nikita Del Assignee: Dmitry Lukyanov (Inactive)
Resolution: Works as Designed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Problem/Incident
causes CSHARP-2924 Consider adding conversion logic into... Closed

 Description   

 

var settings = MongoClientSettings.FromUrl(new MongoUrl("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass%20Community&ssl=false"));
            var client = new MongoClient(settings);
            var database = client.GetDatabase("ZipDataSet");
            var collection = database.GetCollection<Zip>("Zips");            await collection.InsertManyAsync(new List<Zip>
            {
                new Zip
                {
                    ZipCode = 1,
                    Population=100,
                },
                new Zip
                {
                    ZipCode = 2,
                    Population=200,
                },
                new Zip
                {
                    ZipCode = 3,
                    Population=300,
                },
            });            
 
           //this is expected behavior
            var resultFind = await collection.Find(new BsonDocument()).Project(el => new { 
                DividedPopulation = el.Population / 23
            }).ToListAsync();
 
            //this is throw exception
            var resultProject = await collection.Aggregate().Project(el => new {
                DividedPopulation = el.Population / 23
            }).ToListAsync();
 

 

 

Exception:

 

  Message: 
    System.FormatException : An error occurred while deserializing the DividedPopulation property of class <>f__AnonymousType0`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]: Truncation resulted in data loss.
    ---- MongoDB.Bson.TruncationException : Truncation resulted in data loss.
  Stack Trace: 
    BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
    BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
    BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
    EnumerableSerializerBase`2.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
    CursorDeserializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
    AggregateResultDeserializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
    CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage)
    CommandUsingCommandMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken)
    ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol`1 protocol, ICoreSession session, CancellationToken cancellationToken)
    RetryableReadOperationExecutor.ExecuteAsync[TResult](IRetryableReadOperation`1 operation, RetryableReadContext context, CancellationToken cancellationToken)
    ReadCommandOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
    AggregateOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
    AggregateOperation`1.ExecuteAsync(IReadBinding binding, CancellationToken cancellationToken)
    OperationExecutor.ExecuteReadOperationAsync[TResult](IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken)
    MongoCollectionImpl`1.ExecuteReadOperationAsync[TResult](IClientSessionHandle session, IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken)
    MongoCollectionImpl`1.AggregateAsync[TResult](IClientSessionHandle session, PipelineDefinition`2 pipeline, AggregateOptions options, CancellationToken cancellationToken)
    MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
    IAsyncCursorSourceExtensions.ToListAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)
    StatisticsEventRepository.SuperCustomLogicHere() line 81
    MongoRepositoryTests.DoNothing() line 27
    --- End of stack trace from previous location where exception was thrown ---
    ----- Inner Stack Trace -----
    RepresentationConverter.ToInt32(Double value)
    Int32Serializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
    BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)



 Comments   
Comment by Dmitry Lukyanov (Inactive) [ 05/Feb/20 ]

Hello niksan_la2@mail.ru,

the difference in your cases is related to the fact that we use completely different logic (including server logic) for Find and Aggregate operations. So, the behavior which you see is expected.

Consider this workaround for your case:

var resultProject = collection.Aggregate().Project(
el => new { 
   DividedPopulation = ((double)(el.Population / 23))            
}).ToList();

Comment by Nikita Del [ 29/Jan/20 ]

 public class Zip
        {
            public int ZipCode { get; set; }
            public int Population { get; set; }
        }

I've forgotten to write class

Generated at Wed Feb 07 21:43:50 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.