Reputation: 884
I found a strange thing: when updating a document, if a field contains a Dictionary<GUID, *>
, an exception occurs. I'm using driver version 3.1.0.
Code:
BsonSerializer.TryRegisterSerializer(new GuidSerializer(BsonType.String));
Doc:
public class Lib
{
public Dictionary<Guid, GameLib> Games { get; set; } = [];
public Dictionary<string, GameLib> GamesX { get; set; } = [];
}
Request with Dictionary<Guid, *>
:
var uu = Builders<Lib>.Update.Set(f => f.Games[gameId].Status, GameLibStatus.Backlog);
This code throws this error:
MongoDB.Driver.Linq.ExpressionNotSupportedException: Expression not supported: f.Games.get_Item(229341dc-7125-4093-b407-7092245c7d9b).
at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.GetItemMethodToFilterFieldTranslator.Translate(TranslationContext context, Expression expression, MethodInfo method, Expression fieldExpression, ReadOnlyCollection
1 arguments) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.GetItemMethodToFilterFieldTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.MethodCallExpressionToFilterFieldTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.ExpressionToFilterFieldTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.MemberExpressionToFilterFieldTranslator.Translate(TranslationContext context, MemberExpression memberExpression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.ExpressionToFilterFieldTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToField[TDocument,TField](Expression
1 expression, IBsonSerializer1 documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions, Boolean allowScalarValueForArrayField) at MongoDB.Driver.ExpressionFieldDefinition
2.Render(RenderArgs1 args) at MongoDB.Driver.OperatorUpdateDefinition
2.Render(RenderArgs1 args) at MongoDB.Driver.CombinedUpdateDefinition
1.Render(RenderArgs1 args) at MongoDB.Driver.MongoCollectionImpl
1.ConvertWriteModelToWriteRequest(WriteModel1 model, Int32 index, RenderArgs
1 renderArgs)
at MongoDB.Driver.MongoCollectionImpl1.<>c__DisplayClass83_0.<CreateBulkWriteOperation>b__0(WriteModel
1 model, Int32 index)
at System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable1 source, Func
3 selector)+MoveNext()
at System.Collections.Generic.List1..ctor(IEnumerable
1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation..ctor(CollectionNamespace collectionNamespace, IEnumerable
1 requests, MessageEncoderSettings messageEncoderSettings)
at MongoDB.Driver.MongoCollectionImpl1.CreateBulkWriteOperation(IClientSessionHandle session, IEnumerable
1 requests, BulkWriteOptions options, RenderArgs1 renderArgs) at MongoDB.Driver.MongoCollectionImpl
1.BulkWriteAsync(IClientSessionHandle session, IEnumerable1 requests, BulkWriteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl
1.UsingImplicitSessionAsync[TResult](Func2 funcAsync, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionBase
1.UpdateOneAsync(FilterDefinition1 filter, UpdateDefinition
1 update, UpdateOptions options, Func`3 bulkWriteAsync)
But when I use Dictionary<string, *>
all works fine:
var uu = Builders<Lib>.Update.Set(f => f.GamesX[gameId.ToString()].Status, G
Upvotes: 0
Views: 58