前言
一直没实际用过MongoDB,最近有个项目中用了用,踩了一些坑。这篇文章会介绍将MongoDB->RunCommand结果映射到业务类时碰到的问题,以及对各种方法的探索。
Collection中的数据是这样的:
使用find命令查询数据:
db.runCommand({"find":"test", limit:2, sort:{AddTime:-1}})查询返回的数据结构是这样的,需要的数据在firstBatch中:
{ "cursor" : { "firstBatch" : [ { "_id" : ObjectId("5ad0042944fd3929db6b869f"), "Name" : "李四", "AddTime" : ISODate("2018-04-12T01:13:18.965Z") }, { "_id" : ObjectId("5ad003e844fd3929db6b869e"), "Name" : "张三", "AddTime" : ISODate("2018-04-02T01:11:18.965Z") } ], "id" : NumberLong(0), "ns" : "test.test" }, "ok" : 1.0}下面将在C#中运行find命令来执行查询,并将结果映射到自定义的PersonInfo类。
private class PersonInfo { public string Id { get; set; } public string Name { get; set; } public DateTime AddTime { get; set; } }需要注意PersonInfo中的属性Id和Document中的名称_id有些不一样,需要进行映射。因为不同的反序列化方法,采用的方式也会不同,所以下面会有相关介绍。
使用Json.NET
因为Json.NET用的比较多,基本思路就是用它来反序列化Bson,但是Json和Bson是不同的,不能用JsonConvert。
不过Json.NET提供了一个新的包Newtonsoft.Json.Bson来解析Bson数据,并且提供了一个例子。
https://mand) .GetElement("cursor").Value.ToBsonDocument() .GetElement("firstBatch").Value.AsBsonArray.Select(d => { var dbd = d.AsBsonDocument; return new PersonInfo() { Id = dbd.GetElement("_id").Value.AsObjectId.ToString(), AddTime = dbd.GetElement("AddTime").Value.ToLocalTime(), Name = dbd.GetElement("Name").Value.ToString(), }; }).ToList();
运行后直接返回List<PersonInfo> ,更贴近业务需求。
这是本文中最简单的方式了。
如果做的更通用点,可以在这里通过反射自动实例化相关类型,不过这不如直接使用SDK内置的反序列化方式了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。