Как преобразовать BsonDocument в строго типизированный объект с официальным драйвером MongoDB С#?

Для тестирования модулей я хотел бы проверить сопоставления классов без чтения и записи документов в базу данных MongoDB. Для обработки особых случаев, таких как ссылки на родительские и дочерние ссылки на круглые родительские и дочерние ссылки, я использовал BsoncClassMap.RegisterClassMap< MyType>(...) с некоторыми настраиваемыми сопоставлениями, переопределяющими сопоставленные по умолчанию AutoMap(); сопоставления.

Кто-нибудь знает, как преобразовать BsonDocument в желаемый строго типизированный объект, не совершая туда поездку в базу данных? Водитель делает это при переходе в хранилище данных и из него. Моя цель состояла бы в использовании той же логики, что драйвер MongoDB С# использует внутренне для проверки сериализации в/из объекта домена С# в BsonDocument.

Я могу использовать метод расширения Bson ToBsonDocument() для преобразования объекта С# в BsonDocument? Мне не хватает части, противоположной процессу - по существу BsonDocument.ToObject< MyType>();.

Возможно ли это с последней версией официального драйвера MongoDB С#? Похоже, это должно быть - мне интересно, если я просто слепой, и я пропущу очевидное.

Ответы

Ответ 1

Драйвер 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;}
}

Надеюсь, это поможет.

Ответ 2

Прямой путь, если вы хотите сопоставить строки, извлеченные из mongoDB, в класс внутри вашего кода, как показано ниже

//Подключение и запрос от MongoDB

var db = client.GetDatabase("blog");
var col = db.GetCollection<BsonDocument>("users");
var result = await col.Find(new BsonDocument("Email",model.Email))
                       .ToListAsync();

//читаем первую строку из результата

    var user1 = result[0];
    result[0] would be say "{ "_id" : ObjectId("569c05da09f251fb0ee33f5f"), "Name" : "fKfKWCc", "Email" : "[email protected]" }

"

//пользовательский класс с именем и электронной почтой

User user = new User();

//присваиваем

User.Name = user1[1].ToString();      // user1[1] is "fKfKWCc"    
User.Email = user1[2].ToString();      // user1[2] is "[email protected]"

Ответ 3

В случае необходимости части объекта, например: У вас есть субъект Учитель:

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="[email protected]"; // 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);

Теперь у вас есть список курсов из taecher и конвертировать ответ BsonDocument в "IEnumerable".

Ответ 4

Используйте ключевое слово 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();
        }