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

Distinct should still work when TField is not exactly right (like it used to)

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • 2.4.2
    • Affects Version/s: 2.4.1
    • Component/s: API, Serialization
    • Labels:
      None

      I got an exception when I had updated MongoDB.Driver from 2.4.0 to 2.4.1.

      System.NotSupportedException : Values of type 'String' cannot be deserialized using a serializer of type 'CastingSerializer<String, IEnumerable<String>>'.
         в MongoDB.Bson.Serialization.Serializers.SerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         в MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         в MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         в MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         в MongoDB.Driver.Core.Operations.ElementDeserializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         в MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         в MongoDB.Driver.Core.WireProtocol.CommandWireProtocol`1.ProcessReply(ConnectionId connectionId, ReplyMessage`1 reply)
         в MongoDB.Driver.Core.WireProtocol.CommandWireProtocol`1.Execute(IConnection connection, CancellationToken cancellationToken)
         в MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocol[TResult](IWireProtocol`1 protocol, CancellationToken cancellationToken)
         в MongoDB.Driver.Core.Servers.Server.ServerChannel.Command[TResult](DatabaseNamespace databaseNamespace, BsonDocument command, IElementNameValidator commandValidator, Func`1 responseHandling, Boolean slaveOk, IBsonSerializer`1 resultSerializer, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
         в MongoDB.Driver.Core.Operations.CommandOperationBase`1.ExecuteProtocol(IChannelHandle channel, ServerDescription serverDescription, ReadPreference readPreference, CancellationToken cancellationToken)
         в MongoDB.Driver.Core.Operations.CommandOperationBase`1.ExecuteProtocol(IChannelSource channelSource, ReadPreference readPreference, CancellationToken cancellationToken)
         в MongoDB.Driver.Core.Operations.ReadCommandOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken)
         в MongoDB.Driver.Core.Operations.DistinctOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken)
         в MongoDB.Driver.OperationExecutor.ExecuteReadOperation[TResult](IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken)
         в MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperation[TResult](IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken)
         в MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperation[TResult](IReadOperation`1 operation, CancellationToken cancellationToken)
         в MongoDB.Driver.MongoCollectionImpl`1.Distinct[TField](FieldDefinition`2 field, FilterDefinition`1 filter, DistinctOptions options, CancellationToken cancellationToken)
      

      My use case is very simple and complies next example:
      https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#return-distinct-values-for-an-array-field

      In my case I have a news collection. Each news can contain few tags. I want to select all unique tags from all news in collection. Next code block shows this situation (also see attachments).

      Unable to find source-code formatter for language: cs. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
      [TestFixture]
      public class DistinctValuesForAnArrayFieldTest
      {
          [Test]
          public void ShouldDistinctValuesForAnArrayField()
          {
              // Given
      
              var mongoClientSettings = new MongoClientSettings { Server = new MongoServerAddress("localhost") };
              var mongoClient = new MongoClient(mongoClientSettings);
              var mongoDatabase = mongoClient.GetDatabase("test");
              var mongoCollection = mongoDatabase.GetCollection<News>("news");
      
              mongoCollection.InsertMany(new[]
                                         {
                                             new News { Title = "News 1", Tags = new [] { "A", "B" } },
                                             new News { Title = "News 2", Tags = new [] { "B", "C" } },
                                             new News { Title = "News 3", Tags = new [] { "C", "D" } }
                                         });
      
              // When
      
              // It works fine only for v2.4.0 and throws an exception for v2.4.1
              // System.NotSupportedException : Values of type 'String' cannot be deserialized using a serializer of type 'CastingSerializer<String, IEnumerable<String>>'.
              var uniqueTags = mongoCollection.Distinct<string>("Tags", Builders<News>.Filter.Empty).ToList();
      
      
              // Then
      
              CollectionAssert.AreEquivalent(new[] { "A", "B", "C", "D" }, uniqueTags);
          }
      }
      
      
      public class News
      {
          public string Title { get; set; }
      
          public IEnumerable<string> Tags { get; set; }
      }
      

      Until 2.4.1 this code worked fine but not now. I noticed your changes in FieldValueSerializerHelper.cs and I think this bug relates with them. But anyway this bug relates with latest changes in the serialization mechanism.

      If you know a correct way to get distinct items from array field which complies v2.4.1, please, let me know.

            Assignee:
            robert@mongodb.com Robert Stam
            Reporter:
            as.mezhov Alexander Mezhov
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: