2012-12-16 3 views
0

정보를 온라인 상태로 유지할 수 있는지 여부는 간단하지만 강력하게 형식화 된 모델을 사용하지 않고 쿼리 할 수 ​​없다는 것을 나타내는 것처럼 보입니다.C# MongoDb를 쿼리하여 기본 JSON을 사용하는 경우

시나리오에 대한 배경 지식을 얻기 위해 클라이언트 측 자바 스크립트 응용 프로그램이 있습니다.이 응용 프로그램은 모델을 로컬로 생성하고 저장합니다 (로컬 저장소). 그러나 권한이 부여 된 사용자를 통해 모델을 전송할 수있는 웹 서비스 (ASP MVC)가 있으며이를 확인하고 유지합니다.

이제 문제는 클라이언트 측 응용 프로그램이 업데이트됨에 따라 모델이 변경되는 경향이 있다는 것입니다. 데이터베이스 마이그레이션 스크립트와 유사하지만 모델을 고려해야합니다. 그러나 그들은 모두 버전과 이주 스크립트를 가지고 있으므로 시스템은 저장된 (클라이언트 측) 구형 모델을로드 한 다음 최신 버전으로 갱신하고 다시 저장하도록 허용합니다.

그래서 클라이언트 측에서는 서로 다른 버전의 모델을 다루기 때문에 mongodb/C# 질문이 어디에 있는지 궁금 할 것입니다.

서버 측에서 유효성 검사 기준은 주어진 시간에 항상 최신 버전의 모델에 대해 항상 적용됩니다. 따라서 최신 클라이언트 측 모델 버전이 2.3이면 서버 측은 동일하고 올바르게 유효성을 검사합니다.

이 시점에서 클라이언트 측 모델 @ 버전 3.1을 저장한다고 가정하면 서버는 버전 3.1의 유효성을 검사하고이를 MongoDB에 유지합니다. 그런 다음 1 년 동안 사라집니다. 클라이언트 측 버전이 5.1 인 경우 컴퓨터가 포맷되어 더 이상 로컬 데이터가 없으므로 다운로드 할 수 있습니다. 5.1 모델은 다음과 매우 다릅니다. 버전 3.1. 서버는 데이터를 마이그레이션 할 준비가되어 있지 않지만 데이터베이스에 입력 한 시점에서 유효하다는 것을 알았지 만 데이터베이스에있는 JSON을 클라이언트에 전송할 수없는 이유는 없습니다. 그 다음에 자동 마이그레이션됩니다. 메모리에로드 된 다음 클라이언트에 다시 저장됩니다. 이제는 최신 버전 (5.1)을 나타내는 서버 모델로 인해 예외적 일 수도 있고 모델의 나머지 변수를 기본값으로 채울 수도 있습니다. (클라이언트는 서버 모델을 업데이트하여 클라이언트를 통해 서버 모델을 업데이트 할 수 있습니다. 데이터가 항상 최신 버전이 아닌지 걱정하십시오.)

그래서 모든 쿼리가 2 가지 필드에 대해 change (AccountId, PersistedId), 나는 강하게 타입이 지정된 객체없이 원시 BSON 문서를 얻고 그 BSON 문서에서 ToJson()을 호출하고 클라이언트에게 다시 보내기 위해 MongoDB 객체를 쿼리 할 수없는 이유를 보지 못했습니다. 그렇다면 강력한 유형을 사용하지 않고도 데이터를 읽을 수있는 방법이 있습니까? 그래서 필자의 글을 검증하고 강력하게 형식화 된 모델을 사용할 수는 있지만, 데이터를 꺼낼 때 원시 BSON을 쿼리하고 싶습니까?

오랫동안 바람을 피운다해도 "강하게 입력 된 모델을 사용할 수없는 이유는 무엇입니까?"라는 문맥을 피하고 싶습니다.

답변

1

따라서 원시 BsonDocuments를 사용하여 쿼리 할 수 ​​있습니다. 형식이 지정되지 않지만 형식화 된 모델을 사용하여 만들 수 있습니다. 어쩌면 이것은 타협일까요?

var queryDocument = Query<Person>.Eq(p => p.Name, "Jack"); 
// { "name" : "Jack" } 

그렇지 않으면 버전을 이와 같이 작동시키는 의도가있는 경우 스키마 마이그레이션을 처리 할 수있는 마법의 탄환이 없습니다. 모든 데이터베이스 스택에서 문제가됩니다. 우리는 serialization tutorial에 그것을 다루기 위해 작성된 문서를 가지고 있습니다.

+0

안녕하세요. 메신저를 만들려는 요점은 서버에서 스키마 마이그레이션을 수행 할 필요가 없다는 것입니다. 내부 데이터를 제공하면 바깥 쪽 데이터가 있어야한다는 것은 멍청한 유효성을 검사하고 유지하기 때문입니다.강력한 타입의 모델을 사용하는 것 이외의 다른 방법으로 데이터를 쿼리 할 수 ​​없다면 문제가있을 수 있습니다. Query.Where ("Name", Eq)와 같은 일을 할 수있는 일종의 쿼리 생성 인터페이스가있을 것으로 기대하고 있습니다. ("Some-Example-Name")) .ToJson();'또는 이와 비슷한 방식으로, 쿼리해야하는 유일한 것들은 JSON의 가장 중요한 속성이며 절대로 바뀌지 않을 것입니다. (TRULY NEVER) – Grofit

+0

그렇게 할 수 있습니다. Query.EQ ("Name", "Some-Example-Name"). ToJson()이 이미 작동합니다. 나는 당신이 정확히 json으로하고 싶은 일에 대해 혼란스러워합니다. 서버를 쿼리하면 json에서 대화를하지 않기 때문에 json을 보낼 수 없습니다. 그것은 bson을 말한다. –

+0

죄송합니다. JSON은 순전히 내가 신경 쓰고 있기 때문에 바이너리 JSON에서 C# 계층 회담을 알고 있지만 궁극적으로 스키마가없는 쿼리를 원한다면 위의 구문이 이미 존재하는 경우 반환 된 JSON을 반환해야합니다. 귀하의 예) 다음 그것은 내가 원하는 것을 할 수있는 것처럼 보입니다. 필자는 강력하게 형식화 된 클래스없이 데이터를 쿼리하고 반환하려고합니다. 위의 도움을 주셔서 감사합니다! – Grofit