• <五>.nercore 使用MongoDB 基本操作


    一、准备工作

    1、VisualStudio并创建一个新控制台项目作为演示项目。

    2、nuget获取MongoDB.Driver驱动,该驱动依赖于MongoDB.Bson和MongoDB.Driver.Core两个组件。MongoDB.Bson是一个独立的bson库,它处理领域对象类型(poco)到BSON类型的转换。BSON主要被用作MongoDB数据库中的数据存储和网络传输格式。MongoDB.Driver.Core也是一个驱动程序,它具有驱动程序的核心组件,用于从.net到MongoDB的通信。MongoDB.Driver在最顶层,提供异步方法以及支持linq,让开发人员更好的调用Driver.Core中的api。

     二、操作数据库

    • 连接数据库
    var client = new MongoClient(); //默认连接到端口27017上的实例的无参数构造方法
    
    var connectionString = "mongodb://localhost:27017";
    var client1 = new MongoClient(connectionString); //接收一个连接字符串的构造方法
    
    var client2 = new MongoClient(new MongoUrl(connectionString));//接受一个MongoUrl的实例
    
    //接受一个MongoClientSettings的实例
    var  settings= MongoClientSettings.FromConnectionString(connectionString);
    var client3 = new MongoClient(settings); 
    
    var settings1 = new MongoClientSettings
    {
        Server = new MongoServerAddress("localhost", 27017),
    };
    var client4 = new MongoClient(settings1);
    • 获取数据库上下文,如下图,client提供了DropDatabase和GetDatabase方法,这样就可以获取数据库上下文了(IMongoDatabase )
    IMongoDatabase db = client.GetDatabase("User");

    •  操作数据库 ,IMongoDatabase  接口为我们提供了众多操作数据库的方法,比如创建集合,获取集合对象
     static async Task TestAsync()
            {
                var connectionString = "mongodb://localhost:27017";
                var client = new MongoClient(connectionString);
                IMongoDatabase database = client.GetDatabase("School");
                IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("Student");
            }
    • 文档格式 BsonDocument,BsonDocument是键值对集合,可以往里面添加键值对

    var document = new BsonDocument();
    document.Add("name","张三");
    document.Add("age", "12");
    document.Add("sex", "");
    document["address"] = "广东省";
    • 插入文本InsertOneAsync,如果数据库、集合不存在,则会自动创建
    await collection.InsertOneAsync(document);

    •  BsonDocument是一种文档存储方式,当然也可以用我们的类属性来作为键值对集合,属性当成键值
    var connectionString = "mongodb://localhost:27017";
    var client = new MongoClient(connectionString);
    IMongoDatabase database = client.GetDatabase("School");
    IMongoCollection<StudentNew> collection = database.GetCollection<StudentNew>("StudentNew");
    IEnumerable<StudentNew> studentNews=new List<StudentNew> {
                new StudentNew
                {
                    Name="张三",
                    Age="12",
                    Address=new List<string>{ "广东深圳", "广东广州"},
                    Sex=""
                },
                new StudentNew
                {
                    Name="李四",
                    Age="13",
                    Address=new List<string>{ "湖南长沙", "湖南张家界"},
                    Sex=""
                },
                new StudentNew
                {
                    Name="王五",
                    Age="14",
                    Address=new List<string>{ "江苏南京", "浙江杭州"},
                    Sex=""
                }
            };
    await collection.InsertManyAsync(studentNews);
    
    class StudentNew
    {
            public string Name { get; set; }
            public string Age { get; set; }
            public IEnumerable<string> Address { get; set; }
            public string Sex { get; set; }
    }

    • 查询数据FindAsync,该方法返回一个批处理IAsyncCursor<bsoncocument>,表示数据将会以分批的形式返回,这样有助于确保单个文档在传输过程中不能使用过多的RAM或过多的带宽。可以在驱动程序中通过设置FindOptions 的BatchSize来覆盖默认的批大小。默认情况下,服务器将在不活动10分钟后或客户端耗尽游标后自动关闭游标。若要重写此行为,可以指定在查询中使用FindOptions类的NoCursorTimeout属性值设置为false。但是这样设置必须要手动关闭游标或耗尽游标。

    • FindAsync需要传一个过滤器filter,也是个bsondocment。该文档包含对应的过滤键值。
    var connectionString = "mongodb://localhost:27017";
    var client = new MongoClient(connectionString);
    var database = client.GetDatabase("School");
    var collection = database.GetCollection<BsonDocument>("StudentNew");
    using IAsyncCursor<BsonDocument> cursor = await collection.FindAsync(new BsonDocument());
    while (await cursor.MoveNextAsync())
    {
        IEnumerable<BsonDocument> batch = cursor.Current;
        foreach (BsonDocument document in batch)
        {
            Console.WriteLine(document);
            Console.WriteLine();
        }
    }
    class StudentNew
    {
    public ObjectId _Id { get; set; }
    public string Name { get; set; } public string Age { get; set; } public IEnumerable<string> Address { get; set; } public string Sex { get; set; } }

    •  上面是while循环游标的方式遍历集合,也可以用linq式处理返回的数据集合
    await collection.FindSync(filter).ToListAsync();
    
    await collection.FindSync(filter).ForEachAsync(doc => Console.WriteLine());
    
    await collection.FindSync(filter).FirstOrDefaultAsync();
    • 使用FilterDefinitionBuilder  链式编程

    var filter = new FilterDefinitionBuilder<BsonDocument>().Lt("Age", 14);   //小于比较
    var filter = new FilterDefinitionBuilder<Student>().Lt( student => student.Age, 14);     //小于比较
    • 可以使用静态Builders类来构建过滤器定义,该类还具有用于构建其他内容的静态帮助方法。
    var filter = Builders<BsonDocument>.Filter.Lt("Age", 20);
    var filter = Builders<Student>.Filter.Lt(student=> student.Age, 20);
    • 驱动程序还为过滤器定义重载了3个操作符。这个and (&)or (|)not (!)操作。
    var builder = Builders<BsonDocument>.Filter;
    var filter = builder.Eq("Age", 20) & builder.Eq("Name", "张三");
    • LINQ表达式构建一个查询过滤器
     await collection.Find(student=> student.Age== 14 && student.Sex== "").ForEachAsync(doc => Console.WriteLine(doc));
  • 相关阅读:
    win10系统安装oracle11g时遇到INS-13001环境不满足最低要求
    C#文件重命名的代码
    自学MVC开发基础
    我的面试感悟-----3年工作经验的女程序员的感慨
    问心无愧,莫问前程
    Install your Application into RaspberryPi2 and automatically start up
    基于Vmware player的Windows 10 IoT core + RaspberryPi2安装部署
    MVC开发-后台开发总结
    页面长按禁止弹出选择菜单
    js检测链接(URL)是否有效
  • 原文地址:https://www.cnblogs.com/choii/p/16367286.html
Copyright © 2020-2023  润新知