2016-11-23 2 views
2

Unable to cast object of type 'MongoDB.Bson.Serialization.Serializers.BsonValueSerializer' to type 'MongoDB.Bson.Serialization.IBsonSerializer'PullFilter를 사용하여 배열 요소를 삭제할 때 예외가 발생했습니다.

C# 드라이버 (2.2.4 또는 2.3.0)를 사용하여 MongoDB에서 하위 문서 목록에서 끌어 오기를 시도하는 중입니다.

이 내가 업데이트를 수행하는 방법입니다

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))); 

호출 된 저장소 방법이있다

{ 
    "_id" : ObjectId("5825f74919c55e0c9c4727ee"), 
    "EventId" : "1234-5789", 
    "Documents" : [ 
    { 
     "DocId" : "07c03673-c572-4f56-aaad-0edb52b3a06c", 
     "Name" : "test.pdf" 
    } 
    ] 
} 

그리고 :

public void FindAndUpdate(FilterDefinition<T> filter, UpdateDefinition<T> update) 
{ 
    _context.Collection<T>().FindOneAndUpdate(filter, update); 
} 

이 같은 MongoDB를 문서 모습입니다 예외는 내가 얻는다 :

구현이/ IBsonSerializer ( Documentation)를 상속하기 때문에 0
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) 

는 예외는 이해가되지 않습니다, 그래서 RenderBsonValueSerializer을 할 수 있어야한다 기대.

분명히 이것은 C# BSon 드라이버의 FindOneAndReplace 메서드 안에 있습니다. 이것은 운전자의 버그입니까, 아니면 제가 잘못하고 있습니까?

나는 같은 방식으로 당기기를하는 사람들 (here)을 찾았습니다. 매우 비슷한 문제 (here)가있는 것으로 확인되었지만 해결 방법과 토론으로 해결할 수 없습니다.

답변

0

필터는 입력되므로 필터링 대상과 필터를 일치시켜야합니다.

컬렉션의 필터는 FilterDefinition < 이벤트>이어야합니다.

PullFilter와 함께 사용되는 필터는 FilterDefinition < 문서> 여야합니다.

필드를 식별하는 데 "DocId"를 사용했기 때문에이 필드는 컴파일 타임에 발견되지 않으므로 필드와 관련된 유형 정보가 없습니다. 이벤트의 필터 인 PullFilter에 전달 된 필터에서 필드 유형이 추론되었습니다.

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); 
:

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); 

여기 빌더의 마지막 사용에 문서 대신 이벤트를 사용하여 코드의 다음은 컴파일 타임 오류가 발생 입력 된 버전을 사용하여 다시 작성 코드입니다

관련 문제