2014-09-04 1 views
0

Я реализовал пользовательский Bson Serializer, этот пользовательский BsonSerializer, похоже, отлично работает при сохранении и получении документов mongo. Но при попытке выполнить обновление он, похоже, не вызывает сериализатор.Mongo db C# update.SetWrapped метод, не вызывающий пользовательский Bson Serializer

Just FYI, Я добавил DecimalSerializer, который преобразует десятичное значение в значение Int32 и при десериализации он преобразует обратно в десятичное значение. Поэтому, обновляя десятичное значение, он не вызывает никакого сериализатора.

Оператор обновления: Update.SetWrapped("Tiers.$.Price", tier.Price), это становится сохраненным как тип строки в mongo db.

ответ

0

Похоже, что определенные сборки драйвера не запустить BSON сериалайзера на обновлениях

https://github.com/mongodb/mongo-csharp-driver/blob/e455c963cb385b94fdcd02d1e53b536b47663239/src/MongoDB.Driver/MongoCollection.cs

public virtual WriteConcernResult Update(IMongoQuery query, IMongoUpdate update, MongoUpdateOptions options) 
    { 
     var updateBuilder = update as UpdateBuilder; 
     if (updateBuilder != null) 
     { 
      if (updateBuilder.Document.ElementCount == 0) 
      { 
       throw new ArgumentException("Update called with an empty UpdateBuilder that has no update operations."); 
      } 
     } 

     if (options == null) 
     { 
      throw new ArgumentNullException("options"); 
     } 

     var queryDocument = query == null ? new BsonDocument() : query.ToBsonDocument(); 
     var updateDocument = update.ToBsonDocument(); 
     var messageEncoderSettings = GetMessageEncoderSettings(); 
     var isMulti = options.Flags.HasFlag(UpdateFlags.Multi); 
     var isUpsert = options.Flags.HasFlag(UpdateFlags.Upsert); 
     var writeConcern = options.WriteConcern ?? _settings.WriteConcern ?? WriteConcern.Acknowledged; 

     var operation = new UpdateOpcodeOperation(_collectionNamespace, queryDocument, updateDocument, messageEncoderSettings) 
     { 
      IsMulti = isMulti, 
      IsUpsert = isUpsert, 
      WriteConcern = writeConcern 
     }; 

     using (var binding = _server.GetWriteBinding()) 
     { 
      return operation.Execute(binding, Timeout.InfiniteTimeSpan, CancellationToken.None); 
     } 
    } 

Но случается при сохранении

public virtual WriteConcernResult Save(Type nominalType, object document, MongoInsertOptions options) 
    { 
     if (nominalType == null) 
     { 
      throw new ArgumentNullException("nominalType"); 
     } 
     if (document == null) 
     { 
      throw new ArgumentNullException("document"); 
     } 

     var serializer = BsonSerializer.LookupSerializer(document.GetType()); 

мне это действительно связано из того факта, что сериализатор, вероятно, должен иметь весь объект, а при выполнении обновления весь объект никогда не приходит к клиенту. Это, вероятно, ожидается. Ваши варианты:

  1. вручную сериализации tier.Price перед тем setWrapped
  2. Проверьте, чтобы увидеть, если другой вариант работы драйвера (может быть не стоит)
  3. Bug доклад MongoDB вопросов (информация на Github странице)
  4. Избегайте использования пользовательского сериализатора для десятичных типов (BSON изначально имеет двойные типы данных)