IT

BsonDocument를 공식 MongoDBC# 드라이버로 강력한 형식의 객체로 변환하는 방법은 무엇입니까?

itgroup 2023. 7. 12. 23:43
반응형

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

반응형