然后 使用T4模板, 根据List<ModelMap>生成实体类
【MongoDB】C#中的Mongo数据类型转换
用过Mongo的人都知道,Mongo使用的是Bson类型,有string,int,date,bool等数据类型,具体就不详述了。
在使用Mongo 的C#官方驱动时会碰到一个问题,如何将Bson中的数据类型与C#中的数据类型匹配起来。
以下就是我在实际项目中碰到的需要匹配的数据类型。
id
比如说所有的Mongo文档里都有一个_id,如果没有标识,直接在对象类中定义一个_id属性,那么在数据读取或保存时就会报错。
因此在对象类中应当如下进行定义:
[BsonId] public ObjectId _id { get; set; }
DateTime
又比如在对象类中定义一个DateTime类型,保存到Mongo后再读取出来发现,取出来的日期比存入的日期要小。
原来Mongo数据库中都会将时间保存成UCT时间,即格林威治时间,比北京时间要晚8小时。
不过如果在时间属性前加上以下标签,即可解决问题。
[BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime BeginTime { get; set; }
转载于:https://www.cnblogs.com/nonkicat/p/5579860.html
[TestMethod]
public void TestMethod1() {
string conn = "mongodb://192.168.3.166:27017";
string dbName = "TestDB";
string collectName = "TestColle";
MongoClient client = new MongoClient(conn);
IMongoDatabase database = client.GetDatabase(dbName);
IMongoCollection<BsonDocument> colls = database.GetCollection<BsonDocument>(collectName);
BsonDocument document = colls
.Find(Builders<BsonDocument>.Filter.Empty)
.SortByDescending(x => x["CreationTime"]).FirstOrDefault();
// 递归 查询 BsonDocument
List<ModelMap> list = new List<ModelMap>();
this.GetDoc("Hangers", document, list);
}
public class ModelMap {
public ModelMap(string name) {
this.Name = name;
}
public string Name { get; set; }
// 一一对应
public List<string> PropTypes { get; set; }
public List<string> PropNames { get; set; }
}
/// <summary>
/// 递归获取类
/// </summary>
public void GetDoc(string name, BsonDocument document, List<ModelMap> objs) {
List<BsonElement> bsons = document.Elements.ToList();
ModelMap curModel;
objs.Add(curModel = new ModelMap(name));
foreach (BsonElement b in bsons) {
Debug.WriteLine(b.Name);
if (curModel.PropNames == null) {
curModel.PropTypes = new List<string>();
curModel.PropNames = new List<string>();
}
if (b.Value.IsBsonDocument) {
curModel.PropTypes.Add(b.Name);
curModel.PropNames.Add(b.Name);
GetDoc(b.Name, b.Value.ToBsonDocument(), objs);
} else if (b.Value.IsBsonArray) { // List判断
BsonArray arr = b.Value as BsonArray;
BsonValue val = arr.FirstOrDefault();
if (val.IsBsonDocument) {
curModel.PropTypes.Add($"List<{b.Name}>");
curModel.PropNames.Add(b.Name);
GetDoc(b.Name, val.ToBsonDocument(), objs);
} else {
curModel.PropTypes.Add($"List<{val.BsonType.ToString()}>");
curModel.PropNames.Add(b.Name);
}
} else {
curModel.PropTypes.Add(b.Value.BsonType.ToString());
curModel.PropNames.Add(b.Name);
}
}
}