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;

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/whitebai/p/11689363.html
Copyright © 2011-2022 走看看