2013-10-27 6 views
1

나는 mongo .net 클라이언트를 사용하며 컬렉션에 개체 기능을 사용하고 있습니다. 문제 나는 스키마 진화에 걸쳐 왔어요Mongo .net 클라이언트 스키마 진화 오류

예를 들어 필드 이름을 메모에서 설명으로 변경하고 클래스에서이 변경을 수행하면 가져 오기를 수행 할 때 Mongo에서 예외가 발생합니다.

내 mongo 클라이언트는 컬렉션에 존재하지만 내 .net 클래스에는 존재하지 않는 필드를 무시한다는 것이 예상됩니다.

은 가능하면 bson과 .net 클래스간에 변환을하지 않아도 만족할 것입니다. 필드에 Comments 부동산/필드의 데이터를 찾기 위해 MongoDB를 C#을 드라이버를 말할 것 그 구문을 사용

class Demo { 
    [BsonElement("Comment")] 
    public string Comments { get; set; } 
} 

: 당신이 이전 이름을 계속 사용하려면

답변

2

당신은 BsonElement 속성을 사용할 수 있습니다 필드 이름은 Comment입니다. 즉, 이전 위치에서 데이터를 이동/복사하는 것에 대해 걱정할 필요가 없습니다. 실제 BSON 문서 크기를 최소화하면서 더 긴 이름을 소스 코드에서 사용할 수 있도록 종종 사용됩니다 (전체 속성 이름은 항상 데이터베이스 컬렉션의 문서에 저장 됨).

[BsonElement("c")] 
public string Comments { get; set; } 

MongoDB의 드라이버 중 일부는이 기능이없는 (그리고 나는 그들이했던 기원합니다!) : 단축하면 예를 들어 바로 사용할 수 있습니다. 'Comment라는 이름의 필드가 발견 된 경우,

[BsonIgnoreExtraElements] 
public Demo { 
    public string Comments { get; set; } 
} 

그런 다음,하지만 할 수 있습니다

둘째, 당신은 또한 단지 클래스의 모든 알 수없는 요소를 무시 클래스에 특별한 속성을 추가 할 수 있고 예외를 발생하지 C# 클래스의 속성과 일치하면 무시됩니다. 스키마 변경에 따라 개발 중에 이것을 자주 사용 하겠지만, 예기치 않은 필드를 잡을 수 있도록 나중에 제거 할 것입니다.

은 또는 당신은 또한 유사한 변경하려면 BsonClassMap 사용할 수 있습니다

BsonClassMap.RegisterClassMap<Demo>(cm => { 
    cm.AutoMap(); 
    cm.SetIgnoreExtraElements(true); 
}); 

here을 문서화 좀 더 많은 옵션이 있습니다 당신은 완벽하게 제어합니다.

관련 문제