如何使用官方MongoDB C#驱动程序将BsonDocument转换为强类型对象?

时间:2014-06-23 23:02:05

标签: c# mongodb

出于单元测试的目的,我想测试我的类映射,而无需在MongoDB数据库中读取和写入文档。为了处理特殊情况,例如循环父/子引用和只读属性,我使用了BsoncClassMap.RegisterClassMap< MyType>(...)一些自定义映射来覆盖默认的AutoMap();生成的映射。

有没有人知道如何在不进行数据库往返的情况下将BsonDocument转换为所需的强类型对象?当进出数据存储时,驱动程序正在执行此操作。我的目标是使用MongoDB C#驱动程序在内部使用的相同逻辑来测试从C#域对象到/从BsonDocument的序列化。

我能够使用Bson扩展方法ToBsonDocument()将C#对象转换为BsonDocument吗?我缺少的这一部分与过程相反 - 主要是BsonDocument.ToObject< MyType>();

最新版本的官方MongoDB C#驱动程序是否可以实现?它似乎应该是 - 我想知道我是否只是盲目而且错过了显而易见的事情。

4 个答案:

答案 0 :(得分:30)

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;}
}

我希望这会有所帮助。

答案 1 :(得分:1)

如果要将从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"

答案 2 :(得分:1)

如果您需要对象的一部分,例如: 你有实体老师:

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);

现在,您有一个来自taecher的课程列表,并将BsonDocument答案转换为“IEnumerable”。

答案 3 :(得分:0)

使用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();
        }