如何使用官方的MongoDB c#驱动程序将BsonDocument转换为强类型对象
本文关键字:转换 BsonDocument 强类型 对象 驱动程序 官方 何使用 MongoDB | 更新日期: 2023-09-27 18:10:10
出于单元测试的目的,我想测试我的类映射,而不需要将文档读写到MongoDB数据库中。为了处理诸如循环父/子引用和只读属性之类的特殊情况,我使用BsoncClassMap.RegisterClassMap< MyType>(...)
和一些自定义映射来覆盖默认的AutoMap();
生成的映射。
有人知道如何将BsonDocument转换为所需的强类型对象而不需要往返数据库吗?驱动程序在进出数据存储时这样做。我的目标是使用与MongoDB c#驱动程序内部相同的逻辑来测试从c#域对象到BsonDocument的序列化。
我能够使用Bson扩展方法ToBsonDocument()
将c#对象转换为BsonDocument?我缺少的部分是该过程的相反部分——本质上是BsonDocument.ToObject< MyType>();
。
这是否可能与最新版本的官方MongoDB c#驱动程序?看起来应该是这样的——我在想,我是不是只是瞎了眼,错过了显而易见的东西。
MongoDB Driver确实提供了从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"
如果您需要对象的一部分,例如:你有一个实体Teacher:
public class Teacher
{
public string Mail {get; set;}
public IEnumerable<Course> Courses {get; set;}
public string Name {get; set;}
}
And entity Course:
public class Course
{
public int CurseCode {get; set;}
public string CourseName {get; set;}
}
如果您只需要"Teacher"实体中的"Courses",则可以使用:
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的答案转换为"IEnumerable"。
使用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();
}