MongoDB via C#

安裝

  1. 首先須要安裝 MongoDB.Driver 包 nuget
  2. 首先的首先,須要安裝好 Mongo 數據庫 下載Mongo
  3. 配置好數據庫,構建好鏈接字符串就能夠繼續使用了 鏈接字符串

! mongodb 默認是沒有用戶名和密碼的,並且IP和端口都是開放的,請自行作好安全防範的內心準備html

數據

數據層次

DataBase

對應 SQL的 Databasegit

Collection

對應 SQL的 Tablegithub

Document

對應 SQL的 Rowmongodb

文檔結構

BsonId

對於MongoDB中全部的Document都必須有一個_id字段。數據庫

在C#中對於這個"_id"字段可使用一下的幾種操做:api

  1. ObjectId [Id|id|_id]
  2. [ValueType|string] [Id|id|_id]

若是吝嗇使用Id這個屬性名(字段名)的話,也可以使用 [BsonId] 這個特性手動的指定映射的Id字段。
不論使用的是以上什麼方法,在MongoDB中存儲的永遠會是 _id 。
固然,也能夠不添加該字段,若是不想在查詢的時候報錯的話,仍是須要進行一些額外的操做的。數組

對於ObjectId類型的_id,但是使用 ObjectId.GenerateNewId() 生成。安全

幾個經常使用的特性

  1. [BsonId] : (prop) 指定_id字段
  2. [BsonIgnore] : (prop) 在MongoDB中忽略,參考[JsonIgnore]
  3. [BsonRequired] : (prop) 在MongoDB中強制要求
  4. [BsonElement()] : (prop) 指定數據庫中的映射
  5. [BsonExtraElements] : (prop) 該字段爲擴展字段
  6. [BsonIgnoreExtraElements] : (class) 忽略額外的字段

大部分的特性對於插入的影響不大,對於查詢有較大的影響。其中忽略額外元素的特性能夠進行丟棄_id的操做。異步

操做

MongoDB 中增刪改都提供了One和Many兩組,同步和異步兩套,也就是4個操做。ui

Insert

_collection.InsertOne(new Document(){});
_collection.InsertMany(new List<Document>(){});
_collection.InsertOneAsync(new Document(){});
_collection.InsertManyAsync(new List<Document>(){});

Delete

_collection.DeleteOne(_=>_.id == id);
_collection.DeleteMany(_=>_.userid == userid);
_collection.DeleteOneAsync(_=>_.id == id);
_collection.DeleteManyAsync(_=>_.userid == userid);

Update

_collection.UpdateOne(_=>_.id == id,updateDefinition)
_collection.UpdateMany(_=>_.userid = userid,updateDefinition)
_collection.UpdateOneAsync(_=>_.id == id,updateDefinition)
_collection.UpdateManyAsync(_=>_.userid = userid,updateDefinition)

Query

_collection.Find(_=>_.id == id).First();
_collection.Find(_=>_.id == id).FirstOrDefault();
_collection.Find(_=>_.userid == userid).ToList();
_collection.Find(_=>_.id == id).FirstAsync();
_collection.Find(_=>_.id == id).FirstOrDefaultAsync();
_collection.Find(_=>_.userid == userid).ToListAsync();
await _collection.FindAsync(_=>_.userid == userid);

對於查詢的結果還能夠進行進一步的操做。

_collection.Find(filter)
            .SortBy(_=>_.CreateTime)
            .Skip(skip)
            .Limit(limt)
            .Project(_=>new ProjectDocument(_))
            .As<Document>()
            .ForEachAsync(func);

Count

_collection.Count(_=>_.userId == userid).Count();
_collection.Count(_=>_.userId == userid).CountAsync();

Query One And

_collection.FindOneAndDelete(_=>_.id == id);
_collection.FindOneAndReplace(_=>_.id == id, new Document());
_collection.FindOneAndUpdate(_=>_.id == id ,updateDefinition);
_collection.FindOneAndDeleteAsync(_=>_.id == id);
_collection.FindOneAndReplaceAsync(_=>_.id == id, new Document());
_collection.FindOneAndUpdateAsync(_=>_.id == id ,updateDefinition);

Definition

以上全部的操做中查找可使用 filter definition 也可使用 lambda 表達式,更改則須要使用 update definition .
全部的definition可使用 Builders<T> 進行建立,也是自行實例化 DefinitionBuilder<T> 而後構建。如下默認習慣性使用Builders<T>進行構建。

Filter Definition

Filter Definition 至關於篩選條件,條件之間但是進行組合。

  1. 簡單條件

    var filter = Builders<Document>.Filter.Eq(_=>_.userId,userId);
    _collection.Find(filter).ToList();
    <=>
    _collection.Find(_=>_.userId == userId).ToList();
  2. 條件組合

    var filter = Builders<Document>.Filter.Eq(_=>_.userId,userId)
                &Builders<Document>.Filter.Eq(_=>_.title,title);
    
    var filter1 = Builders<Document>.Filter.Eq(_=>_.userId,userId)
                | Builders<Document>.Filter.Eq(_=>_.title,title);
    
    var filter2 = !filter;
    
    <=>
    
    var filter = Builders<Document>.Filter.And(
                            Builders<Document>.Filter.Eq(_=>_.UserId,userid),
                            Builders<Document>.Filter.Eq(_=>_.Title,title)
                            );
    
    var filter1 = Builders<Document>.Filter.Or(
                            Builders<Document>.Filter.Eq(_=>_.UserId,userid),
                            Builders<Document>.Filter.Eq(_=>_.Title,title)
                            );
    var filter2 = Builders<Document>.Filter.Not(filter);
  3. 更多條件

    Builders<Document>.Filter.Lt
    Builders<Document>.Filter.Lte
    Builders<Document>.Filter.Ne
    Builders<Document>.Filter.Gt
    Builders<Document>.Filter.Gte
    Builders<Document>.Filter.Not
    Builders<Document>.Filter.In
    Builders<Document>.Filter.Nin
    Builders<Document>.Filter.Exists
    Builders<Document>.Filter.Regex
    Builders<Document>.Filter.All
    Builders<Document>.Filter.Any
    Builders<Document>.Filter.Size
    Builders<Document>.Filter.SizeGt
    Builders<Document>.Filter.SizeGte
    Builders<Document>.Filter.SizeLt
    Builders<Document>.Filter.SizeLte
    Builders<Document>.Filter.OfType
    
    and more ...

    以上只列舉了部分的Filter,點擊查看的Filter

Update Definition

Update Definition 是更新條目,相比Filter Definition,Update Definition 但是進行鏈式操做

Builders<Document>.Update.Set(_=>_.title,title)
                         .Set(_=>_.desc,desc);

相對於SQL來講,MongoDB中提供的Update操做豐富多彩。除了基本的Set,另外還有對於數組的AddToSet、UnSet等,對於時間有CurrentDate等。點擊查看全部Update

Aggregate

MongoDB 中提供了聚合操做但是方便的對文檔集合進行操做。其中經常使用的包括了 Group,Match,Project;

_collection.Aggregate().Match(_ => _.UserId==userid)
                       .Group(_ => new {
                            _.Type
                        }, g => new
                        {
                            Type = g.Key,
                            Count = g.Count()
                        })
                       .Project(_ => new
                        {
                            UserId = userid,
                            Type = _.Type,
                            Count = _.Count
                        })
                       .ToList();

須要注意的是,Group和Project中的表達式返回類型對應的都須要是一個對象,在進行映射的時候會轉換成BsonDocument,若是直接使用 Group(_=>_.Type,...)這樣的操做的話,會拋出 沒法將 BsonValue 轉化爲 BsonDocument 的錯誤。

Tips

閒時更新

若有錯誤,多謝指正

相關文章
相關標籤/搜索