BsonDocument를 공식 MongoDBC# 드라이버로 강력한 형식의 객체로 변환하는 방법은 무엇입니까?
유닛 테스트를 위해 MongoDB 데이터베이스에 문서를 읽고 쓰지 않고 클래스 매핑을 테스트하고 싶습니다.순환 상위/하위 참조와 같은 특수한 경우를 처리하고 속성만 읽기 위해 사용했습니다.BsoncClassMap.RegisterClassMap< MyType>(...)
일부 사용자 지정 매핑이 기본값보다 우선합니다.AutoMap();
생성된 매핑입니다.
데이터베이스를 왕복하지 않고 BsonDocument를 원하는 강력한 유형의 객체로 변환하는 방법을 아는 사람이 있습니까?드라이버는 데이터 저장소를 오가는 동안 이 작업을 수행합니다.제 목표는 MongoDBC# 드라이버가 내부적으로 사용하는 것과 동일한 논리를 사용하여 C# 도메인 개체에서 BsonDocument로 직렬화를 테스트하는 것입니다.
나는 Bson 확장 방법을 사용할 수 있습니다.ToBsonDocument()
C# 객체를 BsonDocument로 변환하시겠습니까?제가 부족한 부분은 프로세스의 반대입니다 - 본질적으로.BsonDocument.ToObject< MyType>();
.
이것이 공식적인 MongoDBC# 드라이버의 최신 버전으로 가능합니까?그래야 할 것 같습니다. 제가 그냥 눈이 멀고 뻔한 것을 놓치고 있는 것은 아닌지 궁금합니다.
MongoDB 드라이버는 Bson에서 사용자 유형으로 역직렬화하는 방법을 제공합니다.그BsonSerializer
에서 찾을 수 있습니다.MongoDB.Bson.dll
,에서MongoDB.Bson.Serialization
네임스페이스입니다.
사용할 수 있습니다.BsonSerializer.Deserialize<T>()
방법.몇 가지 예제 코드는 다음과 같습니다.
var obj = new MyClass { MyVersion = new Version(1,0,0,0) };
var bsonObject = obj.ToBsonDocument();
var myObj = BsonSerializer.Deserialize<MyClass>(bsonObject);
Console.WriteLine(myObj);
어디에MyClass
로 정의됩니다.
public class MyClass
{
public Version MyVersion {get; set;}
}
이것이 도움이 되길 바랍니다.
mongoDB에서 가져온 행을 코드 내의 클래스에 매핑하려면 간단한 방법은 다음과 같습니다.
//Connect and Query from MongoDB
var db = client.GetDatabase("blog");
var col = db.GetCollection<BsonDocument>("users");
var result = await col.Find(new BsonDocument("Email",model.Email)).ToListAsync();
//read first row from the result
var user1 = result[0];
result[0] would be say "{ "_id" : ObjectId("569c05da09f251fb0ee33f5f"), "Name" : "fKfKWCc", "Email" : "pujkvBFU@kQKeYnabk.com" }"
//A user class with name and email
User user = new User();
// assign
User.Name = user1[1].ToString(); // user1[1] is "fKfKWCc"
User.Email = user1[2].ToString(); // user1[2] is "pujkvBFU@kQKeYnabk.com"
개체의 일부가 필요한 경우, 예를 들어 다음과 같습니다.엔티티 선생님이 있습니다.
public class Teacher
{
public string Mail {get; set;}
public IEnumerable<Course> Courses {get; set;}
public string Name {get; set;}
}
엔티티 과정:
public class Course
{
public int CurseCode {get; set;}
public string CourseName {get; set;}
}
또한 "선생님" 엔티티의 "과정"만 필요하면 다음을 사용할 수 있습니다.
var db = conection.GetDatabase("school");
var collection = db.GetCollection<Teacher>("teachers"); // Or your collection Name
string mailForSearch="teacher@school.com"; // param for search in linq
var allCoursesBson = collection.Find(x => x.Mail == mailForSearch).Project(Builders<Teacher>.Projection.Include(x => x.Courses).Exclude("_Id")).ToList();
// allCoursesBson is BsonDocument list, then use a first BsonDocument an convert to string for convert to IEnumerable<Courses> type with BsonSerializer.Deserialize
string allCoursesText = resp.FirstOrDefault()[0].ToString();
IEnumerable<Courses> allCourses = BsonSerializer.Deserialize<IEnumerable<Courses>>(allCoursesText);
이제 태처의 과정 목록을 가지고 BsonDocument 답변을 "로 변환합니다."I numberable."
사용하다yield
원하는 대로 데이터를 반환하는 키워드입니다.
public IEnumerable<string> GetMongoFields(string collectionName)
{
var connectionString = ConfigurationManager.ConnectionStrings[DbConfig.GetMongoDb()].ConnectionString;
var databaseName = MongoUrl.Create(connectionString).DatabaseName;
MongoClient client = new MongoClient(connectionString);
var server = client.GetServer();
var db = server.GetDatabase(databaseName);
var collection = db.GetCollection<BsonDocument>(collectionName);
var list = collection.FindAll().ToList();
yield return list.ToJson();
}
언급URL : https://stackoverflow.com/questions/24375928/how-to-convert-a-bsondocument-into-a-strongly-typed-object-with-the-official-mon
'IT' 카테고리의 다른 글
모든 출력을 Bash의 파일로 리디렉션 (0) | 2023.07.12 |
---|---|
git/git-shell 관련 문제를 디버그하려면 어떻게 해야 합니까? (0) | 2023.07.12 |
교차 오리진 요청 차단됨:동일한 오리진 정책은 http://127.0.0.1:8000/api/task-list/의 원격 리소스를 읽을 수 없습니다. (0) | 2023.07.12 |
변경된 파일 이름을 'git log'로만 표시하는 방법 (0) | 2023.07.12 |
쿼리를 보낼 때 이스케이프해야 하는 것은 무엇입니까? (0) | 2023.07.12 |