C#-BsonDocument生成实体类

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值