.Net下MoongoDB的簡單調用

一、安裝.Net 驅動:Install-Package MongoDB.Driversql

二、數據插入 ,連接數據庫   mongodb

    //新建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) 這樣插入之後就自動給字段賦值。json

  //多條插入
  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);//單條插入

三、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 操做: 網站

 異步查詢 ui

//異步查詢
 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 設置每一批的大小。spa

  若是確認返回的數據量 不大,能夠 var ps = await personsCursor.ToListAsync()(或者 ToEnumerable()等)一會兒返回全部數據。還有 Any、First、FirstOrDefault 等以及異步操做。須要注意 MongoDB 中查詢區分大小寫。

四、分頁查詢 

//分頁
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);

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

六、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);

七、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, 仍是場景不對!

八、MongoDB 應用場景

  日誌記錄系統;設備監控數據的存儲;餓了麼外賣騎手接單; 存儲商品、商家信息;網站評論信息;存儲爬蟲爬過來的第三方數據;

  可是像訂單、金融交易、遊戲裝備等這些關鍵信息不要用 MongoDB;

相關文章
相關標籤/搜索