无法施放类型的对象 'mongodb.bson.serialization.serializers.bsonvalueserializer'to类型 'mongodb.bson.serialization.ibsonserializer'
尝试使用C#驱动程序(2.2.4或2.3.0)。
这就是我进行更新的方式:
FilterDefinitionBuilder<Event> filter = new FilterDefinitionBuilder<Event>();
UpdateDefinitionBuilder<Event> update = new UpdateDefinitionBuilder<Event>();
_eventRepo.FindAndUpdate(filter.Eq("EventId", eventid),
update.PullFilter("Documents", filter.Eq("DocId", docid)));
称为存储库方法:
public void FindAndUpdate(FilterDefinition<T> filter, UpdateDefinition<T> update)
{
_context.Collection<T>().FindOneAndUpdate(filter, update);
}
这就是MongoDB文档的样子:
{
"_id" : ObjectId("5825f74919c55e0c9c4727ee"),
"EventId" : "1234-5789",
"Documents" : [
{
"DocId" : "07c03673-c572-4f56-aaad-0edb52b3a06c",
"Name" : "test.pdf"
}
]
}
这是我得到的例外:
An exception of type 'System.InvalidCastException' occurred in MongoDB.Driver.dll but was not handled in user code
Additional information: Unable to cast object of type 'MongoDB.Bson.Serialization.Serializers.BsonValueSerializer' to type 'MongoDB.Bson.Serialization.IBsonSerializer`1[MongoDB.Bson.BsonDocument]'.
Stack trace:
at MongoDB.Driver.PullUpdateDefinition`2.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOneAndUpdateOperation[TProjection](FilterDefinition`1 filter, UpdateDefinition`1 update, FindOneAndUpdateOptions`2 options)
at MongoDB.Driver.MongoCollectionImpl`1.FindOneAndUpdate[TProjection](FilterDefinition`1 filter, UpdateDefinition`1 update, FindOneAndUpdateOptions`2 options, CancellationToken cancellationToken)
例外没有任何意义,因为BsonValueSerializer
实现/继承IBsonSerializer
(文档),因此我希望Render
应该能够服用BsonValueSerializer
。
显然,这在C#BSON驱动程序的FindOneAndReplace
方法内。这是驾驶员的错误还是我做错了什么?
我发现人们以相同的方式进行拉动(这里),这似乎对他们有用。我发现了一个看起来非常相似的问题(在这里),但是解决方案和讨论无法帮助我修复我的问题。
过滤器已键入,您必须将过滤器与它们的过滤匹配。
您在集合上的过滤器应为FilterDefinition&lt; event>。
您与PullFilter一起使用的过滤器应为FilterDefinition&lt; document>。
这不会在编译时间捕获,因为您使用"文档"来识别该字段,因此与该字段没有类型的信息。从传递到Pullfilter的过滤器中推断出该字段的类型,这是事件的过滤器。
我建议使用过滤器的键入版本和更新构建器。这是使用键入版本重写的代码,该版本导致编译时间错误:
var filter = Builders<Event>.Filter.Eq(x => x.EventId, "abc");
var update = Builders<Event>.Update.PullFilter(x => x.Documents, Builders<Event>.Filter.Eq(x => x.DocId, "abc"));
collection.FindOneAndUpdate(filter, update);
这是使用文档的代码,而不是在构建器的最后使用中的事件:
var filter = Builders<Event>.Filter.Eq(x => x.EventId, "abc");
var update = Builders<Event>.Update.PullFilter(x => x.Documents, Builders<Document>.Filter.Eq(x => x.DocId, "abc"));
collection.FindOneAndUpdate(filter, update);