C#-BsonDocument生成实体类

然后 使用T4模板, 根据List生成实体类 

【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 colls = database.GetCollection(collectName);

            BsonDocument document = colls
                .Find(Builders.Filter.Empty)
                .SortByDescending(x => x["CreationTime"]).FirstOrDefault();
            // 递归 查询 BsonDocument
            List list = new List();
            this.GetDoc("Hangers", document, list);
        }

        
public class ModelMap {
     public ModelMap(string name) {
           this.Name = name;
     }
     public string Name { get; set; }
        // 一一对应
     public List PropTypes { get; set; }
     public List PropNames { get; set; }
}

        
/// 
/// 递归获取类
/// 
public void GetDoc(string name, BsonDocument document, List objs) {
      List 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();
                curModel.PropNames = new List();
           }

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

 

你可能感兴趣的:(C#)