zoukankan      html  css  js  c++  java
  • .Net下MoongoDB的简单调用

    1、安装.Net 驱动:Install-Package MongoDB.Driver、数据插入 ,链接数据库   

        //新建Person测试类
        public class Person
        {
            public long Id { get; set; }
            public int Age { get; set; }
            public string Name { get; set; }
            public int Height { get; set; }
            public TestPerson t1{ get; set; }
        }
        public class TestPerson {
            public string Name { get; set; }
        }
        public class ObjectPerson {
            public ObjectId Id { get; set; }
            public int Age { get; set; }
            public string Name { get; set; }
            public int Height { get; set; }
        }
     MongoClient client = new MongoClient("mongodb://127.0.0.1");
     IMongoDatabase database = client.GetDatabase("TestDb");//相当于数据库
     IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");//大致相当于表
     Person p1 = new Person()
     {
        Id = 2,
        Name = "test1",
        Age = 29,
        Height=130
       };          
       collection.InsertOne(p1);//单条插入也支持异步方法,后面建议都用异步的!习惯成自然!
    
    

    回到客户端工具刷新一下,就能看到新插入的数据,MongoDB 会自动创建“数据库” 以及 Collection(约等于“表”)。MongoDB 默认用 id 做主键,因此不用显式指定 id 是主键。

    MongoDB 中没有内置“自增字段”,可以把 Id 声明为 ObjectId 类型(using MongoDB.Bson) 这样插入以后就自动给字段赋值。

      //多条插入
      IMongoCollection<ObjectPerson> collection1 = database.GetCollection<ObjectPerson>("ObjectPersons");//大致相当于表
      List<ObjectPerson> persons = new List<ObjectPerson>() { new ObjectPerson() { Name = "test2", Age = 30, Height = 135 }, new ObjectPerson() { Name = "test3", Age = 31, Height = 140 } };
      collection1.InsertMany(persons);//多条插入

    MongoDB 是用 json 保存的,因此也可以直接以 json 格式插入,用 BsonDocument 来代表:

    IMongoCollection<BsonDocument> dogs = database.GetCollection<BsonDocument>("Dogs");
    string jsondata = "{id:8999,Age:81,Name:'japan',gender:true}";
    BsonDocument p2 = BsonDocument.Parse(jsondata);
    dogs.InsertOne(p2);

    还可以插入有嵌套关系的对象,比如学生和老师,注意不会有表间关系,都是存到一个集合中,注意和关系库不一样。

    IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");//大致相当于表
    Person p1 = new Person()
    {
      Id = 2,
     Name = "test1",
     Age = 29,
     Height=130,
     t1=new TestPerson() { Name="222"}
    };          
     collection.InsertOne(p1);//单条插入

    2、MongoDB查询

    IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
    var filter = Builders<Person>.Filter.Gt(p => p.Age,5);
    var filter1 = Builders<Person>.Filter.And(Builders<Person>.Filter.Gt(p => p.Age, 5), Builders<Person>.Filter.Eq(p => p.Id, 1));// And 并且 还有or方法
    var filter2 = Builders<Person>.Filter.Where(p => p.Age > 5 && p.Id == 1);//和上面的写法是一样的但是,建议用Where方法
     //普通查询
    var result= collection.Find(filter).ToList();
    foreach (var item in result)
    {
       Console.WriteLine(item.Age + item.Name);
    }

     除了 Gt,还有 Gte、In、Lt、Lte、Ne、Nin、Near、NearSphere、Or、Where、And、Not。 当然最常用的还是 Where 操作: 

     异步查询 

    //异步查询
     using (IAsyncCursor<Person> personsCursor = await collection.FindAsync<Person>(filter)) {
     while (personsCursor.MoveNextAsync().Result)//获取下一组数据,相当于是否有指针,MongoDB其实是返回一个组,不像sql每次是一次次取
      {
       IEnumerable<Person> items = personsCursor.Current;//返回当前组的数据
        foreach (var item in items)
        {
         Console.WriteLine(item.Age + item.Name);
        }
     }
     //如果数据量不大,可以直接tolist
      var results = personsCursor.ToList();
    }

      为什么 FindAsync 不直接返回集合,而是要 MoveNext 之后返回一个集合呢?因为返回 的数据量可能很大,因此 MongoDB 是分批下载,下载一批之后执行 GET_More 操作返回下 一批。可以通过 FindOptions 参数的 BatchSize 设置每一批的大小。

      如果确认返回的数据量 不大,可以 var ps = await personsCursor.ToListAsync()(或者 ToEnumerable()等)一下子返回所有数据。还有 Any、First、FirstOrDefault 等以及异步操作。需要注意 MongoDB 中查询区分大小写。

    3、分页查询 

    //分页
    FindOptions<Person, Person> findop = new FindOptions<Person, Person>();
    findop.Limit = 3;//取最多几条
    findop.Skip = 2;//跳过几条
    findop.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Ascending(p => p.Name);//排序
    using (var cursor = collection.FindAsync(filter, findop).Result)
    {
      var items = cursor.ToList();
      foreach (var item in items)
      {
       Console.WriteLine(item.Age + item.Name);
       }
    }

      指定排序规则 findop.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Ascending(p => p.Name);

    4、Json格式取法

    //json格式取法
    IMongoCollection<BsonDocument> bsonDoc = database.GetCollection<BsonDocument>("Persons");
    var filter4 = Builders<BsonDocument>.Filter.Gt("Age", 5);
    using (var persons=await bsonDoc.FindAsync(filter4)) 
    {
    foreach (var item in await persons.ToListAsync()) { Console.WriteLine(item.GetValue("Name").AsString); } }

    5、Update更新操作

    IMongoCollection<Person> upPersons = database.GetCollection<Person>("Persons");
    var upFilter = Builders<Person>.Filter.Where(p => p.Age>20);//筛选条件
    var update = Builders<Person>.Update.Set(c => c.Name, "test2");//更新条件,将Name更新成test2
    upPersons.UpdateMany(filter, update);

    6、Delete删除操作

    IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons");
    var deletefilter = Builders<Person>.Filter.Where(p => p.Id == 1);
    teachers.DeleteMany(deletefilter);

     用 Update 机会比较少,如果频繁的用 Update 可能意味着用错了;也不要想着 join、group by, 还是场景不对!

    7、MongoDB 应用场景

      日志记录系统;设备监控数据的存储;饿了么外卖骑手接单; 存储商品、商家信息;网站评论信息;存储爬虫爬过来的第三方数据;

      但是像订单、金融交易、游戏装备等这些关键信息不要用 MongoDB;

  • 相关阅读:
    运放之典型应用
    关于set_clock_uncertainty的两点注意事项
    ARINC 429 接口简介
    关于set_input/output_delay中的clock_fall和add_delay选项
    卡诺图
    关于乒乓操作的一些小技巧
    程序Title样本参考
    【游戏】精忠报国岳飞传之基本说明一
    运放虚短虚断的简单推导
    我的小型网站搜索分词中遇到的问题
  • 原文地址:https://www.cnblogs.com/whitebai/p/11689363.html
Copyright © 2011-2022 走看看