! mongodb 默認是沒有用戶名和密碼的,並且IP和端口都是開放的,請自行作好安全防範的內心準備html
對應 SQL的 Databasegit
對應 SQL的 Tablegithub
對應 SQL的 Rowmongodb
對於MongoDB中全部的Document都必須有一個_id
字段。數據庫
在C#中對於這個"_id"字段可使用一下的幾種操做:api
ObjectId [Id|id|_id]
[ValueType|string] [Id|id|_id]
若是吝嗇使用Id
這個屬性名(字段名)的話,也可以使用 [BsonId]
這個特性手動的指定映射的Id字段。
不論使用的是以上什麼方法,在MongoDB中存儲的永遠會是 _id 。
固然,也能夠不添加該字段,若是不想在查詢的時候報錯的話,仍是須要進行一些額外的操做的。數組
對於ObjectId類型的_id,但是使用 ObjectId.GenerateNewId()
生成。安全
[BsonId]
: (prop) 指定_id字段[BsonIgnore]
: (prop) 在MongoDB中忽略,參考[JsonIgnore][BsonRequired]
: (prop) 在MongoDB中強制要求[BsonElement()]
: (prop) 指定數據庫中的映射[BsonExtraElements]
: (prop) 該字段爲擴展字段[BsonIgnoreExtraElements]
: (class) 忽略額外的字段大部分的特性對於插入的影響不大,對於查詢有較大的影響。其中忽略額外元素的特性能夠進行丟棄_id的操做。異步
MongoDB 中增刪改都提供了One和Many兩組,同步和異步兩套,也就是4個操做。ui
_collection.InsertOne(new Document(){}); _collection.InsertMany(new List<Document>(){}); _collection.InsertOneAsync(new Document(){}); _collection.InsertManyAsync(new List<Document>(){});
_collection.DeleteOne(_=>_.id == id); _collection.DeleteMany(_=>_.userid == userid); _collection.DeleteOneAsync(_=>_.id == id); _collection.DeleteManyAsync(_=>_.userid == userid);
_collection.UpdateOne(_=>_.id == id,updateDefinition) _collection.UpdateMany(_=>_.userid = userid,updateDefinition) _collection.UpdateOneAsync(_=>_.id == id,updateDefinition) _collection.UpdateManyAsync(_=>_.userid = userid,updateDefinition)
_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);
_collection.Count(_=>_.userId == userid).Count(); _collection.Count(_=>_.userId == userid).CountAsync();
_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);
以上全部的操做中查找
可使用 filter definition 也可使用 lambda 表達式,更改則須要使用 update definition .
全部的definition可使用 Builders<T> 進行建立,也是自行實例化 DefinitionBuilder<T> 而後構建。如下默認習慣性使用Builders<T>進行構建。
Filter Definition 至關於篩選條件,條件之間但是進行組合。
簡單條件
var filter = Builders<Document>.Filter.Eq(_=>_.userId,userId); _collection.Find(filter).ToList(); <=> _collection.Find(_=>_.userId == userId).ToList();
條件組合
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);
更多條件
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 是更新條目,相比Filter Definition,Update Definition 但是進行鏈式操做
Builders<Document>.Update.Set(_=>_.title,title) .Set(_=>_.desc,desc);
相對於SQL來講,MongoDB中提供的Update操做豐富多彩。除了基本的Set,另外還有對於數組的AddToSet、UnSet等,對於時間有CurrentDate等。點擊查看全部Update
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 的錯誤。
閒時更新
若有錯誤,多謝指正